Kann ich den Vim-Bearbeitungsmodus in der Befehlszeile verwenden, ohne die rekursive Verlaufssuche zu verlieren?

8

Ich uzing zsh und da ich ein begeisterter Vim-Benutzer bin, habe ich gerade auf die Bearbeitung im Vim-Stil in der Befehlszeile umgestellt. (Das heißt , wenn ich geben ls foo/barund entscheiden , ich will cdstattdessen kann ich schlagen Esc ^an den Anfang zu hüpfen zurück und cw cdÄnderungen lszu cd.

Das ist alles Dandy, aber das Problem ist, dass ich keine Ctrl+Rrekursive Verlaufssuche mehr durchführen kann . Gibt es eine andere Möglichkeit, oder kann ich die Vim-Tastenkombination irgendwie überschreiben, um sie zurückzubekommen?

Nathan Long
quelle
Eine schwere Wahl! garyjohnzeigt eine Vim-Methode und JdeBPzeigt, wie die Tastenkombination für Strg + R wiederhergestellt wird! Ich werde mit beiden Methoden spielen und später eine Antwort akzeptieren. Ich werde entscheiden, basierend auf 1) welche Methode mir einfacher erscheint und 2) welche mehr positive Stimmen bekommt. Danke euch beiden!
Nathan Long

Antworten:

6

Natürlich können Sie Ctrl+ nicht mehr verwenden R. Wenn Sie das Z Shell-Handbuch lesen, werden Sie feststellen, dass history-incremental-search-backwarddie emacsKeymap nur eine Tastenkombination für das Widget enthält. In den vi-Keymaps sind keine Tastenkombinationen dafür vorhanden.

Wie Sie auch beim Lesen des Handbuchs (Kapitel 18) feststellen werden, ist das Hinzufügen einer Tastenkombination eine recht einfache Übung bei der Verwendung des bindkeyBefehls:

bindkey "^R" history-incremental-search-backward

Sie müssen den zleBefehl nicht einmal verwenden , um das Widget einer Shell-Funktion zuzuordnen, da dies ein Standard-Widget ist.

Wenn Sie die Antwort auf dieselbe Frage konsultieren, die sich im Z Shell-Wiki befindet , werden die Befehle zum spezifischen Hinzufügen dieser zu den vi-Tastenkombinationen "Befehl" und "Einfügemodus" angezeigt:

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

Beachten Sie auch, dass, wie Garyjohn betont, das /Zeichen in der vi "Befehl" -Schlüsselkarte an das vi-history-search-backwardWidget gebunden ist . Der Unterschied zwischen diesem Widget und dem history-incremental-search-backwardWidget besteht im Widget-Verhalten, das angewendet wird, sobald sich eines im Verlaufssuchmodus befindet. Hier sind einige der Unterschiede, die Sie feststellen werden:

  • Umschalten der vi-Modi:
    • Der Suchmodus wechselt history-incremental-search-backwardzwischen mainund und vicmdKeymaps, wenn Sie das vi-cmd-modeWidget aufrufen, während Sie sich noch im Suchmodus befinden. dh von emacsModus presssing die EscTaste oder Ctrl+ XCtrl+ VTasten schaltet den Suchmodus zwischen dem emacsund vicmdkeymaps. (Das Aufrufen history-incremental-search-backwardüber die vicmdKeymap ist daher mühsam, es sei denn, Sie binden auch etwas an vi-cmd-modedie vicmdKeymap.)
    • Der Suchmodus in vi-history-search-backwardbehandelt das vi-cmd-modeWidget als accept-lineund beendet die Suche, wobei der Befehlsmodus, von dem aus Sie die Suche aufgerufen haben, erneut aufgerufen wird. dh (mit den Standardbindungen) wechselt /vom Befehlsmodus in den Suchmodus und Esckehrt in den Befehlsmodus zurück.
  • Suche wiederholen:
    • In history-incremental-search-backwardwerden sowohl das history-incremental-search-backwardals auch das vi-rev-repeat-searchWidget erkannt. dh (vorausgesetzt, Sie haben die Bindungen wie oben geändert) beide Ctrl+ Rund Nsuchen nach einer vorhergehenden übereinstimmenden Zeile.
    • In vi-history-search-backwardwird nur das vi-rev-repeat-searchWidget erkannt. dh (vorausgesetzt, Sie haben die Bindungen wie oben geändert) Ctrl+ Rgibt einen Piepton aus und wird ignoriert.
JdeBP
quelle
Mein Muskelgedächtnis segnet dich!
Nathan Long
4

Im vi-Modus von bash <Esc>/<string><Enter>durchsucht die Eingabe den Befehlsverlauf nach <string>. nwird weiter zurück in der Geschichte suchen; Nwird vorwärts suchen. zshell kann das gleiche sein.

Garyjohn
quelle
1
Das ist jedoch interessant - ich benutze die Suche häufig als Bewegung in Vim. Ich schätze, ich kann es nicht verwenden, um mich innerhalb des Befehls zu bewegen, den ich gerade bearbeite, da es an die Suche im Verlauf gebunden ist, oder?
Nathan Long
Recht. Aber Sie können (zumindest in Bash) das f, F, t, T, ';' verwenden. (Semikolon) und ',' (Komma) Befehle, um vorwärts und rückwärts zu bestimmten Zeichen in der Zeile zu gelangen.
Garyjohn
1

Ich bevorzuge:

bindkey -M vicmd '/' history-incremental-search-backward

Auf diese Weise kann ESC /textich die Befehlszeile eingeben und anzeigen. Wenn ich zum nächsten Match gehen möchte, tippe ichESC n

Jonas Fagundes
quelle