Falls Sie den gesamten Verlauf bearbeiten möchten

Falls Sie den gesamten Verlauf bearbeiten möchten

Problem

Ich verwende oh-my-zsh und Antigen, um mein Zsh zu verwalten.

Manchmal gebe ich versehentlich einen falschen/fehlgeschlagenen Befehl in Zsh ein und es ist sehr ärgerlich, wenn derZsh-Autosuggestions-Plugingibt diese Befehle aus.

Nehmen wir zum Beispiel an, ich habe gut statusstatt eingegeben git status.

Wenn ich jetzt versuche, den richtigen Befehl erneut einzugeben, nachdem ich eingegeben habe g, meldet das Autosuggestion-Plugin gut status, dass dies die beste Übereinstimmung in der jüngeren Vergangenheit ist. Aber das ist ein fehlgeschlagener Befehl!

Was ichIch möchte verhindern, dass diese fehlgeschlagenen Befehle meinen Verlauf "verschmutzen".Das Autosuggestion-Plugin wird sie daher nicht vorschlagen.

Was habe ich getan

Ich habe danach gesucht und die beste Methode zum Ausschließen von Einträgen aus dem Verlauf ist das Setzen von HIST_IGNORE_SPACE oder Methoden zum Ignorieren bestimmter Befehle oder zum manuellen Löschen von Befehlen nach der Eingabe. SieheDasUndDas. Aber wie @Adaephon 52 bemerkte, geschieht diesnachdie Tat ist vollbracht.

Was ich vorhabe

Was mir gerade vorschwebt, ist, eine Funktion zu schreiben, die jedes Mal ausgelöst wird, wenn ein fehlgeschlagener Befehl in Zsh eingegeben wird, um den neuesten Eintrag aus dem Verlauf zu löschen. Ich bin jedoch nicht vertraut genug mit Zsh, um zu wissen, ob diese Art von Trigger existiert oder wie man sie einrichtet.


Hinweis zur akzeptierten Lösung

Für diejenigen, die sich für dieses Problem interessieren: Die akzeptierte Lösung funktioniert in dem Sinne, dass fehlgeschlagene Befehle nicht in der Verlaufsdatei gespeichert werden. fc -loder historybestätigt dies.

Es scheint jedoch, dass das Plugin zsh-autosuggestions seine eigenenlokalCaching (oder generiert Vorschläge mithilfe anderer Mechanismen), sodass weiterhin die fehlgeschlagenen Befehle vorgeschlagen werden, abernur wenn die Sitzung nicht beendet istWenn der Benutzer eine neue Instanz der Shell startet und das Plugin vermutlich den zwischengespeicherten Verlauf laden muss, schlägt es die fehlgeschlagenen Befehle nicht mehr vor (es sei denn, Sie geben sie erneut ein).

Die vorgeschlagene Lösung ist technisch korrekt, da ich meine Frage (fälschlicherweise) so formuliert habe, dass sie nur eine Antwort erfordert, die Zsh daran hindert, die fehlgeschlagenen Befehle zu speichern, und die akzeptierte Lösung tut dies (wenn auch in begrenztem Umfang; Einzelheiten finden Sie unter dem Link in der Lösung).

Jeder, der mit Shell-Scripting vertraut ist (ich bin es nicht) und motiviert genug ist, kann sich diezsh-Autosuggestions-Skript.

Antwort1

Bart Schaeferschlug den folgenden Ansatz vorauf die gleiche Frage zumzsh-BenutzerMailingliste:

 zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }

Diese Funktion wird ausgeführt, bevor die Befehlszeile in den Verlauf geschrieben wird. Wenn sie 1 zurückgibt, wird die aktuelle Befehlszeile weder an die Verlaufsdatei noch an den lokalen Verlaufsstapel angehängt. Die Prüfung, ob der Befehl einenBefehl nicht gefundenFehler deckt nur einfache Fälle ab. Beispielsweise wird diese Zeile im Verlauf angezeigt:

echo foo; echooo bar

Für dein Beispiel funktioniert es aber einwandfrei

gut status

Bitte beachten Sie, dass der falsche Befehl zwar angezeigt wird UP-ARROW(damit Sie ihn korrigieren können!), sich jedoch nicht im Verlaufsstapel befindet; prüfen Sie dies mit fc -l.


Eine mögliche Erweiterung dieser Grundfunktion besteht darin, das Setzen von Umgebungsvariablen in der Befehlszeile zu berücksichtigen, z. B. like DEBUG=1 ./some_prog. Hier prüft die Funktion, ob ein Wort in der Befehlszeile ein Gleichheitszeichen enthält, und prüft in diesem Fall das nächste Wort auf einen gültigen Befehl:

 zshaddhistory() {
   local j=1
   while ([[ ${${(z)1}[$j]} == *=* ]]) {
     ((j++))
   }
   whence ${${(z)1}[$j]} >| /dev/null || return 1
 }

Antwort2

Der eingebaute fcBefehl unterstützt das Bearbeiten Ihres Verlaufs. Falls Sie beispielsweise den vorherigen Befehl falsch eingegeben haben, können Sie Folgendes eingeben:

$ fc -e nano -1

nanoSie können durch den Befehl Ihres bevorzugten Editors ersetzen . Sie können die EDITORVariable (Parameter) auch in Ihrer ZSH-Konfiguration festlegen. (Siehe verweisende SO-Seite)

Sie müssen die Datei speichern (die, die von fc in einem temporären Systemordner erstellt wurde). Danach werden die bearbeiteten Zeilen angezeigt. Enterwird sie ausführen oder Sie können drücken, Ctrl+Cum die Bearbeitung abzuschließen.

Weitere Einzelheiten finden Sie in der zsh-Dokumentation:Zsh: Bearbeitungsverlauf


Falls Sie den gesamten Verlauf bearbeiten möchten

$ fc -W; nano "$HISTFILE"; fc -R

...ersetzen Sie erneut nano, wenn Sie möchten

Es schreibt einfach den Verlauf – einschließlich des Caches – und öffnet die Datei dann mit einem Editor.

Bitte beachte, dasszshkennt drei Arten von Geschichte:

  • Intern: Befehle, die Sie seit der Anmeldung eingegeben haben
  • Lokal: diejenige, die innerhalb der aktiven Shell verfügbar ist - [HISTFILE + Internal]
  • "Global": es hängt davon ab, aber nehmen wir an, es ist die in HISTFILE festgelegte Datei

Bitte beachten Sie, dass für den Fall, dass Ihre Verlaufsdatei weitergegeben wird (SHARE_HISTORY) und Sie haben mehr als eine ZSH-Shell mit dem betreffenden Benutzer geöffnet, dann führen Sie den fc -WBefehl besser zuerst in diesen Shells aus. Wenn Sie mit der Bearbeitung fertig sind, führen Sie aus fc -R. Andernfalls werden die in diesen Shells eingegebenen Befehle nicht gespeichert und Ihre manuelle Bearbeitung der wird dann nicht erkannt HISTFILE.

Antwort3

nicht sicher, wie omz es ausführt, aber sowohl in bash als auch in regulärem zsh verhindert das Präfixieren mit einem Leerzeichen, dass es aus .history und fortan auch aus der automatischen Vervollständigung/Vorschlagsfunktion herauskommt

dh

<space>ll -ahZ  /home/%USER

verwandte Informationen