Komentarze w Zsh w wierszu poleceń

115

Przerzuciłem się całkiem niedawno z Bash na Zsh na Ubuntu i jestem z tego powodu bardzo zadowolony. Jest jednak coś, za czym bardzo tęsknię i nie znalazłem sposobu na osiągnięcie tego samego.

W Bash, ilekroć wpisałem długie polecenie i zauważyłem, że wcześniej musiałem uruchomić coś innego, musiałem to tylko skomentować, jak poniżej:

me@home> #mysuperlongcommand with some arguments
me@home> thecommandIhavetorunfirst #and then: then up up
me@home> #mysuperlongcommand with some arguments #I just need to uncomment it!

Jednak to dość charakterze powtarzającym sytuacja nie jest tak łatwo jak z adresem zsh, zważywszy #mysuperlongcommandzostanie uruchomiony jako takie (i skutkuje: zsh: command not found: #mysuperlongcommand.

Rolf
źródło

Odpowiedzi:

172

Właśnie zacząłem wypróbowywać zsh i napotkałem ten problem. Możesz zrobić, setopt interactivecommentsaby aktywować komentarze w stylu basha.

Lajnold
źródło
3
Możesz też zrobić, set -kjeśli jest to tylko jednorazowe. Ale setoptużyłbym wiersza z tej odpowiedzi w moim zshrc
Hamish Downer,
12
Czy istnieje powód, dla którego nie jest to zachowanie domyślne?
naught101
1
@ naught101 wiele najlepszych bitów zsh jest domyślnie wyłączonych. nie wiem dlaczego
zzapper
@ naught101, ponieważ jest nowy i innowacyjny. bardzo postęp, dużo
lepiej
40

używam

bindkey "^Q" push-input

Z instrukcji zsh:

Wepchnij całą bieżącą konstrukcję multilinii na stos buforów i wróć do podpowiedzi najwyższego poziomu (PS1). Jeśli bieżąca konstrukcja parsera to tylko pojedyncza linia, jest to dokładnie takie samo, jak push-line. Następnym razem, gdy edytor zostanie uruchomiony lub załadowany za pomocą funkcji get-line, konstrukcja zostanie zdjęta z wierzchu stosu buforów i załadowana do bufora edycji.

A więc wygląda to tak:

> long command
Ctrl+Q => long command disappears to the stack
> forgotten command
long command reappears from stack
> long command

Ponadto, jeśli ustawisz INTERACTIVE_COMMENTSopcję ( setopt INTERACTIVE_COMMENTS), będziesz mógł używać komentarzy w interaktywnych powłokach, tak jak jesteś przyzwyczajony.

Michał Politowski
źródło
Podoba mi się twoja opcja, ale nie mogę sprawić, żeby zadziałała :( Czy jest sposób, w jaki powinienem zapisać powiązanie w pliku, czy to tylko dwa znaki, ^ i Q? Moje polecenie jest wymazane, ale nie wiem jak sprawić, by pojawiła się ponownie na wejściu
Mihnea Simian
2
@Mihnea jeśli polecenie zniknie, wydaje się, że działa wejście push. Powinien pojawić się ponownie po uruchomieniu następnego polecenia lub po naciśnięciu klawisza Enter. Czy to nie robi tego?
Michał Politowski
1
@barbaz można manipulować stosem za pomocą read -zi print -z, więc w przypadku niektórych skryptów i plików tymczasowych można. Ale wtedy niestandardowy widżet zle do zapisywania wiersza poleceń w pliku tymczasowym może być prostszy, a udostępniona historia będzie jeszcze prostsza.
Michał Politowski
1
Podczas gdy obecnie akceptowana odpowiedź odpowiada na pytanie pytającego , ta odpowiedź dotyczy intencji pytającego . To znaczy zsh ma lepszy sposób osiągnięcia zamierzonego rezultatu i to wszystko.
wjv,
1
To powinna być akceptowana odpowiedź. Jeśli używasz oh-my-zsh, możesz użyć Ctrl-Q do tego po wyjęciu z pudełka.
Gecko
18

Często to robię. To, co robię, to wycinanie długiego polecenia, wykonywanie polecenia, które musi iść jako pierwsze, a następnie wklejanie długiego polecenia z powrotem. To proste: CTRL + U wycina bieżące polecenie do bufora, CTRL + Y wkleja je. Działa w zsh i bash.

Fredrik Möllerstrand
źródło
cóż, właściwie mój sposób to obejście, podczas gdy twoje rozwiązanie jest najlepsze;)
Rolf
4
To nie powinna być akceptowana odpowiedź. Rozwiązaniem poniżej, które mówi, aby użyć "setopt interactivecomments" powinno być. Powodem tego jest to, że jeśli po prostu wytniesz bieżące polecenie, nie ma go w historii zsh, a także nie możesz łatwo użyć wycinania i wklejania podczas wpisywania nowego polecenia bez nadpisywania polecenia, które próbujesz zapisać.
Douglas
1
Korzystanie z komentarzy i rozwiązania w tych odpowiedziach jest obejściem; bardziej poprawna jest metoda push-input opublikowana przez Michała Politowskiego.
Fredrik Möllerstrand
0

Oprócz tego setopt interactivecomments, co zasugerował @Lajnold, możesz również dodać coś podobnego do poniższego, aby zapobiec zapisywaniu niektórych komentarzy w historii (z /superuser/352788/how-to-prevent-a- polecenie-w-powłoce-z-zapisania-w-historii ):

To zastępuje wbudowaną funkcję ZSH zshaddhistory ():

  • Zarejestruje komentarze, które zaczynają się w kolumnie 1, po których nie następuje jedna lub więcej spacji (tj. # Polecenie, do którego chcę wrócić)
  • Nie będzie rejestrować komentarzy zaczynających się w kolumnie 1, po której następuje co najmniej jedna spacja
  • Nie będzie rejestrować komentarzy z wcięciem, wypełnionych spacjami z kolumny 1
  • Nie rejestruje poleceń ze spacją w kolumnie 1 (przydatny skrót do uruchamiania poleceń, których nie chcesz rejestrować
setopt interactivecomments

function zshaddhistory() {
  emulate -L zsh
  if ! [[ "$1" =~ "(^#\s+|^\s+#|^ )" ]] ; then
      print -sr -- "${1%%$'\n'}"
      fc -p
  else
      return 1
  fi
}

Dla porównania, jest to domyślna zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
FlakRat
źródło