Kommentare in der Kommandozeile Zsh

115

Ich habe vor kurzem unter Ubuntu von Bash zu Zsh gewechselt und bin ziemlich glücklich darüber. Es gibt jedoch etwas, das ich wirklich vermisse, und ich habe nicht herausgefunden, wie ich dasselbe erreichen kann.

Wenn ich in Bash einen langen Befehl eingab und bemerkte, dass ich vorher etwas anderes ausführen musste, musste ich es einfach wie folgt auskommentieren:

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!

Diese ziemlich wiederkehrende Situation ist jedoch nicht so einfach zu lösen wie mit zsh, da #mysuperlongcommandsie als solche ausgeführt wird (und zu Folgendem führt : zsh: command not found: #mysuperlongcommand.

Rolf
quelle

Antworten:

172

Nachdem ich gerade angefangen hatte, zsh auszuprobieren, stieß ich auch auf dieses Problem. Sie können dies tun setopt interactivecomments, um die Kommentare im Bash-Stil zu aktivieren.

Lajnold
quelle
3
Sie können auch tun, set -kwenn es nur eine einmalige ist. Aber ich würde die setoptZeile aus dieser Antwort in meinem zshrc
Hamish Downer
12
Gibt es einen Grund, warum dies nicht das Standardverhalten ist?
naught101
1
@ naught101 Viele der besten Bits von zsh sind standardmäßig deaktiviert.
Ich
@ naught101 weil es neu und innovativ ist. sehr Fortschritt, viel verbessern
Ярослав Рахматуллин
40

ich benutze

bindkey "^Q" push-input

Aus dem zsh-Handbuch:

Schieben Sie das gesamte aktuelle mehrzeilige Konstrukt auf den Pufferstapel und kehren Sie zur Eingabeaufforderung der obersten Ebene (PS1) zurück. Wenn das aktuelle Parser-Konstrukt nur eine einzelne Zeile ist, entspricht dies genau der Push-Zeile. Wenn der Editor das nächste Mal gestartet wird oder mit get-line angezeigt wird, wird das Konstrukt vom oberen Rand des Pufferstapels entfernt und in den Bearbeitungspuffer geladen.

So sieht es aus:

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

Wenn Sie die INTERACTIVE_COMMENTSOption ( setopt INTERACTIVE_COMMENTS) festlegen , können Sie auch Kommentare in interaktiven Shells verwenden, wie Sie es gewohnt sind.

Michał Politowski
quelle
Ich mag Ihre Option, aber ich kann sie nicht zum Laufen bringen :( Gibt es eine Möglichkeit, die Bindung in die Datei zu schreiben, oder sind es nur zwei Zeichen ^ und Q? Mein Befehl wird gelöscht, aber ich weiß es nicht wie man es wieder in der Eingabe erscheinen lässt.
Mihnea Simian
2
@Mihnea Wenn der Befehl verschwindet, scheint die Push-Eingabe zu funktionieren. Es sollte wieder angezeigt werden, wenn Sie den nächsten Befehl ausführen oder einfach die Eingabetaste drücken. Tut es das nicht?
Michał Politowski
1
@barbaz Der Stack kann mit read -zund bearbeitet werden print -z, so dass Sie mit einigen Skripten und temporären Dateien. Dann ist ein benutzerdefiniertes zle-Widget zum Speichern der Befehlszeile in einer temporären Datei möglicherweise einfacher, und der freigegebene Verlauf ist noch einfacher.
Michał Politowski
1
Während die aktuell akzeptierte Antwort die Frage des Fragestellers anspricht, spricht diese Antwort die Absicht des Fragestellers an . Dh zsh hat einen besseren Weg, um das beabsichtigte Ergebnis zu erzielen, und das ist es.
wjv
1
Dies sollte die akzeptierte Antwort sein. Wenn Sie oh-my-zsh verwenden, können Sie Strg-Q sofort verwenden.
Gecko
18

Ich mache das auch oft. Ich schneide den Befehl long aus, führe den Befehl aus, der zuerst ausgeführt werden muss, und füge dann den Befehl long wieder ein. Dies ist ganz einfach: STRG + U schneidet den aktuellen Befehl in einen Puffer, STRG + Y fügt ihn ein. Funktioniert in zsh und bash.

Fredrik Möllerstrand
quelle
Nun, eigentlich ist mein Weg eine Problemumgehung, während Ihre Lösung am besten passt;)
Rolf
4
Dies sollte nicht die akzeptierte Antwort sein. Die folgende Lösung, die besagt, dass "setopt interaktive Kommentare" verwendet werden soll, sollte lauten. Der Grund dafür ist, dass wenn Sie nur den aktuellen Befehl ausschneiden, dieser nicht in Ihrem zsh-Verlauf enthalten ist und Sie das Ausschneiden und Einfügen beim Eingeben Ihres neuen Befehls nicht einfach verwenden können, ohne den Befehl zu überschreiben, den Sie versucht haben sparen.
Douglas
1
Die Verwendung von Kommentaren und die Lösung in diesen Antworten sind beide Problemumgehungen. Die von Michał Politowski veröffentlichte Push-Input-Methode ist korrekter.
Fredrik Möllerstrand
0

Zusätzlich zu dem setopt interactivecommentsVorschlag von @Lajnold möchten Sie möglicherweise Folgendes hinzufügen, um zu verhindern, dass bestimmte Kommentare in den Verlauf geschrieben werden (von /superuser/352788/how-to-prevent-a- Befehl-in-der-Zshell-vom-Speichern-in-der-Geschichte ):

Dies überschreibt die in ZSH integrierte Funktion zshaddhistory ():

  • Protokolliert Kommentare, die in Spalte 1 beginnen, gefolgt von einem oder mehreren Leerzeichen (dh #einiger Befehl, auf den ich zurückkommen möchte)
  • Es werden keine Kommentare protokolliert, die in Spalte 1 beginnen, gefolgt von einem oder mehreren Leerzeichen
  • Es werden keine eingerückten Kommentare protokolliert, die durch Leerzeichen aus Spalte 1 aufgefüllt werden
  • Es werden keine Befehle mit einem Leerzeichen in Spalte 1 protokolliert (praktische Verknüpfung zum Ausführen von Befehlen, die nicht protokolliert werden sollen
setopt interactivecomments

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

Als Referenz ist dies die Standardeinstellung von zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
FlakRat
quelle