Verwenden von VI-Tasten zum Bearbeiten von Shell-Befehlen unter UNIX

28

Früher hatte ich einen Kollegen, der wirklich gut mit UNIX umgehen konnte.

Er zeigte mir, wie ich Vi-Tastenkombinationen verwenden kann, um meine Shell-Befehle zu bearbeiten.

Er legte den Befehl in eine Datei, die jedes Mal ausgeführt wurde, wenn ich mich anmeldete.

Seitdem bin ich zu einem anderen Projekt gewechselt.

Leider weiß ich nicht mehr, wie ich das einstellen soll.

Gibt es hier jemanden, der weiß, wie man Vi-Tastenkombinationen verwendet, um Befehle im Terminal zu bearbeiten?

Wie kann ich diese Einstellung dauerhaft machen?

user919860
quelle

Antworten:

31

Du sprichst von dem großartigsten Feature, das es je gab!

Mit vi-Befehlen können Sie Shell-Befehle (und den Befehlsverlauf) bearbeiten, indem Sie Folgendes zu Ihrer .bashrcDatei hinzufügen :

set -o vi

Sie können diesen Befehl auch über die Befehlszeile ausführen, um nur Ihre aktuelle Sitzung zu beeinflussen.

Wenn Sie bash nicht verwenden, ersetzen Sie die entsprechende rc-Datei für Ihre Shell.


Dies ermöglicht es Ihnen, vi-Befehle zu verwenden, um jeden Befehl zu bearbeiten ...

Sie können auch jund verwenden k, um (nach dem Drücken von ESC) durch Ihren Verlauf zu blättern .

Sie können auch /(nach dem Drücken ESC) nach alten Befehlen suchen.

Mit anderen Worten, um den superlangen cpBefehl zu finden, den Sie vor zehn Minuten ausgeführt haben:

ESC/cpENTER

Anschließend können Sie mit nund alle übereinstimmenden Befehle in Ihrem Verlauf durchlaufen N.

All dies macht mich 10 Billionen Mal produktiver auf der Kommandozeile!

jahroy
quelle
4
Nun, es wird nicht wirklich vi verwendet, es werden Tastaturbefehle im vi-Stil für die Zeilenbearbeitung verwendet.
4
Klar ... Ich denke, die passende Terminologie ist, dass dies vi bindings in the shelldas größte Feature ist, das jemals erfunden wurde!
Jahroy
Ich würde von Emacs-Bindungen zu Vi-Bindungen wechseln, wenn es eine Möglichkeit gäbe, den Modus anzuzeigen. Kennen Sie einen Weg, das zu tun?
Iconoclast
Sie, gibt es eine Möglichkeit, sich jjmit ihnen zu binden, ESCwie wir es normalerweise in vim tun?
Steveyang
@yangchenyun - Vielleicht hilft diese Frage dabei: stackoverflow.com/questions/844862/… Ich binde / ändere keinen der Befehle persönlich, also bin ich mir nicht ganz sicher, was Sie fragen.
Jahroy
12

Wenn Sie Bash verwenden, wie jahroy und evil otto bereits geantwortet haben, können Sie verwenden

set -o vi

um bash zu veranlassen, vi-artige Bearbeitungsbefehle zu verwenden.

Sobald Sie dies getan haben, können Sie eingeben Esc v, um den vi-Editor mit einer temporären Datei zu starten, die eine Kopie der aktuellen Befehlszeile enthält. Sie können den Befehl bearbeiten und sogar durch mehrere Zeilen ersetzen. Wenn Sie die Datei speichern ( :wq), führt die Shell die bearbeiteten Befehle aus.

Wenn Sie es vorziehen

set -o emacs

Sie können Ctl-XCtl-Edas Gleiche tun. Es wird Ihren bevorzugten Editor verwenden $EDITOR, nicht unbedingt Emacs.

(Persönlich benutze ich vi (eigentlich vim) für die meisten meiner Bearbeitungen, aber ich bevorzuge es set -o emacsin der Shell. Das Ein- und Ausschalten des Einfügemodus ist großartig für die Bearbeitung von Dateien, aber umständlich für interaktive Befehle. YMMV.)

Keith Thompson
quelle
Kennen Sie den Weg, um zum normalen Bearbeitungsmodus zurückzukehren und den vi-Stil zu vermeiden? Ich erinnere mich, dass ich mit Bl Num erfolgreich war, aber jetzt nicht mehr. Was vermisse ich?
piertoni
@piertoni: Tut set -o emacsnicht was du willst?
Keith Thompson
Ja, es funktioniert, ich habe den Punkt verpasst, danke
piertoni
10

Sie können verwenden set -o vi, um Ihre Zeilenbearbeitungsbefehle wie @jahroy posted zu ändern, aber Sie denken möglicherweise an den fcBefehl (verfügbar in bash und ich denke ksh, aber wahrscheinlich nicht tcsh), der den vorherigen Befehl in einen Editor (FCEDIT oder EDITOR) überträgt , den Sie wahrscheinlich auf vi gesetzt haben) und führt den Befehl dann aus, wenn Sie den Editor verlassen. Weitere help fcInformationen finden Sie in der Manpage oder oder probieren Sie es einfach aus.

böser otto
quelle
5
alias r='fc -e -'ist ein wertvoller Alias, um frühere Befehle erneut auszuführen. fcAllein in Kornschale entstanden, glaube ich. Sie können Befehle nach Nummer angeben ( fc 123 129um die Befehlsnummern 123 bis 129 im Verlauf zu bearbeiten). Sie können relative Zahlen angeben ( fc -10 -1um die letzten 10 eingegebenen Befehle zu bearbeiten). Sie können vorherige Befehle mit auflisten fc -l. Sie können einen Befehl durch ein Präfix mit dem rAlias angeben ( r makeführt den letzten Aufruf von aus make; dies gilt auch, r mwenn Sie mvseit der letzten Ausführung keinen Befehl ausgeführt makehaben usw.).
Jonathan Leffler
6

Verwenden Sie die integrierte fcShell, um den zuletzt verwendeten Befehl in vim zu bearbeiten und eine bearbeitete Version nach dem Speichern und Beenden des Editors aufzurufen . Ohne Argumente wird Folgendes ausgeführt:

  1. Erstellt eine temporäre Datei in /tmpund füllt sie mit dem zuletzt eingegebenen Befehl
  2. Nachdem der Editor normal beendet wurde (mit dem Beendigungscode 0), führt er den in dieser temporären Datei gefundenen Befehl aus und entfernt diese Datei. Die bearbeitete Version wird wie gewohnt im Verlauf gespeichert (zumindest in zsh). Es führt nichts aus, wenn der Editor mit einem anderen Code als Null beendet wird (dies kann in vim Fall erreicht werden, indem er entweder beendet oder verwendet wird :cquit).

Der Befehl funktioniert sowohl in bash als auch in zsh.

ZyX
quelle
5

Dies ist in der Tat das größte Merkmal, das es je gab. Es gibt aber noch mehr:

Erstellen Sie eine Datei mit dem Namen

.editrc

die Zeile enthält

bind -v

Editline ist eine BSD-lizenzierte Versionsbibliothek, die readline-ähnliche Dienste bietet. Mit .editrc werden Ihre Tastaturbelegungen in der MySQL-Befehlszeilen-Shell oder in jeder Anwendung, die readline nicht verwendet, auf den vi-Modus gesetzt.

Ich bin im Laufe der Jahre etwas vergesslich geworden, so dass mein .zshrc einige Wrapper für den vi-Modus beschafft , um mir zu zeigen, in welchem ​​Modus ich mich in der Befehlszeile befinde . Es ist schön.

Ich weiß, dass Sie in zsh schreiben können

bindkey -L

und rufen Sie die Liste der Tastenkombinationen ab. Ich bin sicher, dass Bash etwas Ähnliches haben muss. Nicht alle vi-Schlüssel sind standardmäßig gebunden. Binden Sie sie, wie Sie es für richtig halten, und Sie sind auf dem Weg zu den Rennen.

chiggsy
quelle
Ich wünschte, ich könnte dieses 5-mal für vi-Bindungen in MySQL upvoten!
Jahroy
1

Geben Sie in Ihr Terminal Folgendes ein export EDITOR=vi.

Speichern Sie diese Einstellung. Setzen Sie diese Zeile in die Datei ~ / .profile


quelle
5
Damit legen Sie Ihren Standardeditor (für Befehle, auf die Sie achten $EDITOR) fest vi. Sie können keine Shell-Befehle mit vi(zumindest nicht direkt) bearbeiten .
Keith Thompson
2
@KeithThompson Zsh verwendet standardmäßig den Bearbeitungsmodus vi, wenn er $EDITORenthält vi. Ich denke, es ist die einzige Shell, die das macht.
Gilles 'SO- hör auf böse zu sein'