Jak przeprowadzić wyszukiwanie historii wstecz w trybie vi ZSH?

47

Używam vimzasadniczo wszystkich moich potrzeb edycyjnych, więc postanowiłem jeszcze raz spróbować trybu vi dla mojej powłoki (obecnie ZSH w / oh-my-zsh w OS X), ale próbuję (i nie udaje mi się) używać Ctrl-Rciągle. Jakie jest równoważne przypisanie klucza? A na przyszłość, jak bym to wymyślił? Jestem pewien, że mógłbym użyć bind -Pw bashu.

Hank Gay
źródło
2
Zgodnie z „man zshzle” domyślnie wyszukiwanie w trybie przyrostowym historia-wyszukiwanie-wstecz nie jest ograniczone w trybach Vi (vicmd, viins).
Paul

Odpowiedzi:

56

Możesz uruchomić bindkeybez argumentów, aby uzyskać listę istniejących powiązań, np .:

# 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

W trybie emacs pożądanym wiązaniem jest history-incremental-search-backward, ale domyślnie nie jest ono powiązane w trybie vi. Aby samodzielnie powiązać Ctrl-R, możesz uruchomić to polecenie lub dodać je do ~/.zshrc:

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

zshzlePodręcznika ( man zshzle) ma więcej informacji na temat linii edytora zsh, w bindkey i emacs / VI trybach.

mrb
źródło
3
Dzięki, szczególnie za zshzle. To jest dość pouczające i przydatne.
Hank Gay
Kocham Cię. Poważnie. Po aktualizacji do OSX El Capitan zniknęło wyszukiwanie wsteczne i brakowało mi go bardziej niż wszystkiego innego w moim codziennym przepływie pracy.
Christian
24

To starożytne pytanie, ale jedyna (i zaakceptowana) odpowiedź w zasadzie mówi, jak przeszczepić „emacs-like” history-incremental-search-backwarddo trybu vi. Chociaż jest to całkowicie wykonalne i może być właściwym rozwiązaniem dla ciebie, to trochę dziwne, że nikt nie wspomniał o „vi” sposobie przeszukiwania historii.

Tryb vi w zsh obsługuje historię wyszukiwania przy użyciu standardowych klawiszy vi / vim: /i ?oba są dostępne w trybie komend. (Naciśnij, <Esc>aby przełączyć z trybu wstawiania do trybu poleceń, tak jak w vi lub vim.)

Ich sens jest jednak odwrotny: ponieważ zwykle chcesz przeszukiwać historię powłoki w odwrotnej kolejności, /wykonuje wyszukiwanie do tyłu, podczas ?gdy do przodu.

Po wyświetleniu pierwszego trafienia możesz (podobnie jak w vi / vim) użyć, naby kontynuować znajdowanie kolejnych trafień w tym samym kierunku lub Nodwrócić kierunek wyszukiwania.

Odpowiednie domyślne skróty klawiszowe w vicmdmapie klawiszy to:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search
wjv
źródło
2
Jest także dobry w użyciu "^P" history-beginning-search-backwardi "^N" history-beginning-search-forwarddo autouzupełniania podobnego do vima (zaczynasz pisać, a następnie naciskasz ctrl+plub ctrl+n).
cprn
Dla mnie ?porusza temat bck-i-search, którego dokładnie szukałem. Dziękuję Ci.
geowa4
@wjv zaletą wyszukiwania przyrostowego w historii jest to, że obsługuje wzorce globów. Domyślne /lub `? ' doesnt: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989 15.04.2018
@ alpha_989 Odnośnik do wpisu na blogu jest nieprawidłowy. Możliwe, że autor ma zainstalowaną „platformę” zsh, która przeciąża ^Rwiązanie klawiszy. Jedynym „regex-like” znak obsługiwane przez obie history-search-backwardi history-incremental-search-backwardto ^, aby zakotwiczyć wyszukiwany ciąg do początku linii. Prawdziwą siłą history-incremental-search-backwardjest to, że dokonuje wyszukiwania przyrostowego, jak sugeruje jego nazwa. Mogę sobie wyobrazić, że vicmdz tego powodu można powiązać to w mapie klawiszy.
wjv 17.04.18
@ wjv, masz rację .. Powinienem był napisać history-incremental-pattern-search-backward, nie history-incremental-search-backward. history-incremental-pattern-search-backwardsmoże widget .. ale myślę, że jest domyślnie instalowany w Zsh. Obsługuje globwzorce regexniepoprawnie wskazane: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators . Rzeczywiście jest błąd w poście ..
alpha_989 17.04.18