Wie führe ich im vi-Modus von ZSH eine Rückwärtssuche durch?

47

Ich benutze es vimfür im Wesentlichen alle meine Bearbeitungsanforderungen, daher habe ich mich entschlossen, den vi-mode für meine Shell (derzeit ZSH mit oh-my-zsh unter OS X) erneut zu testen Ctrl-R. Was ist die äquivalente Schlüsselbindung? Und wie würde ich das in Zukunft selbst herausfinden? Ich bin mir ziemlich sicher, dass ich bind -PBash gebrauchen kann .

Hank Gay
quelle
2
Laut 'man zshzle' ist die inkrementelle Historiensuche in den Vi-Modi (vicmd, viins) standardmäßig nicht gebunden.
Paul

Antworten:

56

Sie können bindkeyohne Argumente ausführen , um eine Liste der vorhandenen Bindungen abzurufen, z.

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

Im Emacs-Modus ist die Bindung, die Sie möchten history-incremental-search-backward, im vi-Modus jedoch nicht standardmäßig gebunden. Um Strg-R selbst zu binden, können Sie diesen Befehl ausführen oder zu Ihrem hinzufügen ~/.zshrc:

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

In der zshzlemanpage ( man zshzle) finden Sie weitere Informationen zu den Modi zsh line editor, bindkey und emacs / vi.

mrb
quelle
3
Vielen Dank, besonders für zshzle. Das ist sehr informativ und nützlich.
Hank Gay
Ich liebe dich. Ernsthaft. Nach dem Upgrade auf OSX war El Capitan Reverse Search weg und ich vermisste es mehr als alles andere in meinem täglichen Workflow.
Christian
24

Dies ist eine alte Frage, aber die einzige (und akzeptierte) Antwort sagt im Grunde, wie man den Emacs-ähnlichen history-incremental-search-backwardModus in den vi-Modus umwandelt. Dies ist zwar vollkommen machbar und möglicherweise die richtige Lösung für Sie, aber es ist ein wenig seltsam, dass niemand den "vi way" der Suche in der Vergangenheit erwähnt hat.

Der vi-Modus in zsh unterstützt den Suchverlauf mit den Standard-Tasten vi / vim: /und ?, die beide im Befehlsmodus verfügbar sind. (Drücken Sie <Esc>, um vom Einfüge- in den Befehlsmodus zu wechseln, genau wie in vi oder vim.)

Ihr Sinn ist jedoch umgekehrt: Da Sie den Verlauf Ihrer Shell /normalerweise umgekehrt durchsuchen möchten, führen Sie eine umgekehrte Suche und ?eine Vorwärtssuche durch.

Sobald der erste Treffer angezeigt wird, können Sie (wie in vi / vim) nweitere Treffer in derselben Richtung finden oder Ndie Suchrichtung umkehren.

Die relevanten Standard-Tastaturbelegungen in der vicmdTastaturbelegung sind:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search
wjv
quelle
2
Es ist auch gut zu verwenden "^P" history-beginning-search-backwardund "^N" history-beginning-search-forwardfür eine vim-artige Autovervollständigung (Sie beginnen zu tippen und drücken dann ctrl+poder ctrl+n).
cprn
Für mich ?bringt bck-i-searchdas genau das auf, wonach ich gesucht habe. Danke.
geowa4
@wjv der vorteil von history-incremental-search-backward ist, dass glob patterns unterstützt werden. Die Standardeinstellung /oder "?" doesnt: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989
@ alpha_989 Der Blogbeitrag, auf den Sie verweisen, ist falsch. Möglicherweise hat der Autor ein zsh-Framework installiert, das die ^RTastaturbelegung überlastet . Die einzige „regex-like“ Charakter von beiden unterstützt history-search-backwardund history-incremental-search-backwardist ^, den Such - String an den Anfang der Zeile zu verankern. Die wahre Stärke von history-incremental-search-backwardist, dass es eine inkrementelle Suche durchführt, wie der Name schon sagt. Ich kann mir vorstellen, dass man es vicmdaus diesem Grund in die Keymap einbinden möchte .
WJV
@wjv, du hast recht .. ich hätte schreiben sollen history-incremental-pattern-search-backward, nicht history-incremental-search-backward. history-incremental-pattern-search-backwardsvielleicht ein widget .. aber ich denke es kommt standardmäßig in zsh installiert. Es werden globMuster unterstützt , auf regexdie Sie nicht richtig hingewiesen haben: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators . Es ist in der Tat ein Fehler in der Post ..
alpha_989