So führen Sie die Verlaufssuche im Vi-Modus in bash aus

Ich möchte die Alternative zu Strg + R finden, um den Verlauf in bash zu durchsuchen. Ich kann den vi-Modus in bash aktivieren, aber ich kann ihn nicht suchen lassen. Wenn ich /search oder ?search mache, passiert nichts. Gibt es noch etwas, das ich drücken sollte? Ich habe versucht, die Eingabetaste zu drücken, und dann passiert Folgendes:

$ set -o vi $ ls|grep f $ /gr -bash: /gr: No such file or directory $ 

Kommentare

  • Ist <C-r> funktioniert wirklich nicht für Sie im vi-Modus für readline? Es funktioniert gut mit der neuesten Version von bash.
  • @ D.BenKnoble Ja, aber ich denke, <C-r> ist der Emacs-Modus und ich möchte lernen vi-Modus.
  • <C-r> ist nur eine rekursive Suche. Ich bin mir nicht sicher, ob es irgendetwas mit Emacs vs Vi zu tun hat, zumal es sich möglicherweise um eine Bash-spezifische Erweiterung handelt (mein Gedächtnis ist in diesem Detail verschwommen). Ich entmutige Sie nicht, / zu verwenden, nur dass jeder seine (unterschiedlichen) Verwendungszwecke hat.

Antwort

Es gibt sicherlich eine Suche im Vim-Stil in bash / readline. Tatsächlich ist Ihre Befehlszeile im Wesentlichen eine verkleinerte Version des Vim-Editors mit einer erheblichen Anzahl von Befehlen im Normalmodus, die Ihnen zur Verfügung stehen. Mehr dazu in einer Sekunde, aber erste Suche. Die wichtigste Information, die Sie benötigen, ist, dass Sie sich beim Starren auf den blinkenden Cursor in Ihrer Befehlszeile im Einfügemodus von Vim befinden. Wie gelangen wir also in den Normalmodus? Durch Drücken von Esc natürlich.

Von dort aus drücken Sie / , geben Sie einen Suchbegriff ein und drücken Sie Geben Sie ein. Jetzt können Sie n und N , um sich durch die Ergebnisse zu bewegen. (Sie werden standardmäßig effektiv rückwärts suchen, wobei n ... von Anfang an vorwärts suchen würde keine Ergebnisse liefern, da es in der Zukunft keinen Verlauf gibt!) Um das aktuelle Ergebnis als Befehl auszuführen, drücken Sie erneut .

Vergessen Sie nicht, dass Sie " Sie befinden sich jedoch im normalen Modus. Wenn Sie also nicht finden, wonach Sie suchen, und im Einfügemodus wieder Text eingeben möchten, tun Sie das, was Sie normalerweise in Vim tun. Wenn Sie beispielsweise i drücken, ist dies ausreichend. Oder Sie können den Vim-Befehl C verwenden, der Text nach dem Cursor entfernt und in den Einfügemodus wechselt, was praktisch ist. (Sie können dem mit 0 vorangehen, wenn Sie den Cursor über die erste Spalte hinaus bewegt haben.) Oder verwenden Sie A, a, R, s, s, I, Ctrl-C ... Sie erhalten das Bild.

Neben den verschiedenen Befehlen, die in den Einfügemodus gelangen, können Sie mit b, B, e, E , w, W, 0, $ usw. Yank / delete / put sind ebenfalls vorhanden und können in Aktions- und Navigationsbefehlen wie yB, c2e, d$ usw. 1 Schließlich funktioniert u ndo auch! Probieren Sie selbst andere Dinge aus.

Oh, und wenn Sie sich ein bisschen verlaufen oder, wie mir gelegentlich passiert, ein bisschen Funky beim Zeilenumbruch Ihr c / l durcheinander bringt, können Sie den Vorwand fallen lassen und . Dadurch wird der Inhalt Ihrer Befehlszeile in eine tatsächliche Instanz von Vim verschoben, sodass Sie ihn mit einem vollständig bewaffneten und betriebsbereiten Texteditor bearbeiten können Sobald dies erledigt ist, :wq, um das, was Sie haben, zur Ausführung an die Shell zu senden.

1 Leider der Operator + Bewegungsbefehle (caw, dis, yap usw.) werden nicht unterstützt. Der Kommentar von @EdNeville enthält jedoch einen Link zu einigen Readline-Einstellungen , der scheinbar hinzugefügt wird Jeder Op-Motion-Befehl gibt es ebenso wie eine Reihe anderer. Sie können Ihre befehlszeilenbasierte Vim-Erfahrung wirklich abrunden, indem Sie sie Ihrer .inputrc-Datei hinzufügen.


Zusätzliche Informationen : Sie können nicht nur das verwenden, was set -o vi oder set -o emacs gibt Ihnen. Sie können jeden der verfügbaren Readline-Befehle verwenden. Ich glaube, Ctrl-R sollte auch im Vim-Modus verfügbar sein, aber wenn nicht, können Sie es versuchen Fügen Sie dies in Ihre ~/.inputrc ...

set editing-mode vi "\C-r": reverse-search-history "\C-s": forward-search-history 

Besser noch, Sie können einige ansonsten nicht verfügbare Befehle wie

"\C-o": operate-and-get-next 

Damit haben Sie einen Befehl aus dem Verlauf ausgewählt (züber die Vim-Suche) drücken Sie Ctrl-O anstelle von Enter und Bash führt den Befehl aus und fügt den nächsten Befehl aus dem Verlauf ein, der zur Ausführung bereit ist.

Eine vollständige Liste finden Sie im Abschnitt Readline-Befehlsnamen in der Bash-Manpage.

(Sie können diese auch über die Befehlszeile mit der Befehl, aber ich komme hier schon zu weit.)

Kommentare

  • Schön. Ein Lernmoment.
  • @niklas, das ist deine Antwort
  • @glennjackman Ich nutze diese Funktionalität sehr stark. Wirklich nützlich für mich.
  • @NiklasRosencrantz Ja, ich habe verstanden. Wir Versuchen Sie, Antworten zu schreiben, die im Allgemeinen nützlich sind, anstatt sich nur auf den Fragesteller zu konzentrieren. Daher habe ich zusätzliche Informationen zum Mischen von Befehlen aus verschiedenen Modi hinzugefügt.
  • Sie können auch Dinge wie ciw Wenn Sie .inputrc ändern: usenix.org.uk/content/bash.html#input

Antwort

Was @ B-Layer erwähnt hat, funktioniert in Bash und ähnlich in zsh ziemlich gut.

Da Sie bereits VIM verwenden Wenn Sie neovim oder vim8 verwenden, können Sie auch :terminal ausprobieren öffnet das Standardterminal in vim.

Anschließend können Sie mit dem Befehl vim durch die Ausgabe des Termminals sowie durch den Verlauf der Terminalbefehle navigieren.

Ref.

  1. http://vimcasts.org/episodes/neovim-terminal/
  2. https://neovim.io/doc/user/nvim_terminal_emulator.html
  3. https://github.com/vim/vim/blob/master/runtime/doc/terminal.txt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.