45

I use vim for essentially all my editing needs, so I decided to once again try vi-mode for my shell (currently ZSH w/ oh-my-zsh on OS X), but I find myself trying (and failing) to use Ctrl-R constantly. What's the equivalent key-binding? And for future reference, how would I figure this out myself? I'm pretty sure I could use bind -P in bash.

  • 2
    According to 'man zshzle', history-incremental-search-backward is not bound in Vi modes (vicmd, viins) by default. – paul Jul 27 '12 at 13:45
52

You can run bindkey with no arguments to get a list of existing bindings, eg:

# 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

In emacs mode, the binding you want is history-incremental-search-backward, but that is not bound by default in vi mode. To bind Ctrl-R yourself, you can run this command, or add it to your ~/.zshrc:

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

The zshzle manpage (man zshzle) has more information on zsh's line editor, bindkey, and emacs/vi modes.

  • 3
    Thanks, particularly for zshzle. That is quite informative and useful. – Hank Gay Jul 27 '12 at 15:27
  • I love you. Seriously. After upgrading to OSX El Capitan reverse search was gone and I missed it more than everything else in my daily workflow. – Christian Oct 17 '15 at 18:09
21

This is an ancient question, but the only (and accepted) answer basically tells one how to transplant the “emacs-like” history-incremental-search-backward to vi mode. Whilst this is perfectly doable and may be the right solution for you, it’s a little strange that no one has mentioned the “vi way” of searching history.

vi mode in zsh supports searching history using the standard vi/vim keys: / and ?, both available in command mode. (Hit <Esc> to switch from insert to command mode, just like in vi or vim.)

Their sense is reversed, though: Since you usually want to search your shell’s history in reverse, / does a reverse search whereas ? does a forward search.

Once the first hit is displayed, you can (just like in vi/vim) use n to continue finding more hits in the same direction, or N to reverse the direction of the search.

The relevant default keybindings in the vicmd keymap are:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search
  • 2
    It's also good to use "^P" history-beginning-search-backward and "^N" history-beginning-search-forward for vim-like autocompletion (you start typing, then press ctrl+p or ctrl+n). – cprn Oct 31 '16 at 20:45
  • For me, ? brings up bck-i-search, which is exactly what I was looking for. Thank you. – geowa4 Dec 2 '16 at 1:40
  • @wjv the advantage of history-incremental-search-backward is that is supports glob patterns. The default / or `?' doesnt: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex – alpha_989 Apr 15 '18 at 16:12
  • @alpha_989 The blog post you reference is incorrect. It may be that the author has some zsh “framework” installed that overloads the ^R keybinding. The only “regex-like” character supported by both history-search-backward and history-incremental-search-backward is ^, to anchor the search string to the start of the line. The real power of history-incremental-search-backward is that it does an incremental search, as its name suggests. I can imagine that one might want to bind it in the vicmd keymap for that reason. – wjv Apr 17 '18 at 6:23
  • @wjv, you are right.. I should have written history-incremental-pattern-search-backward, not history-incremental-search-backward. history-incremental-pattern-search-backwards maybe a widget.. but I think it comes installed by default in zsh. It supports glob patterns not regex as you correctly pointed out: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators. There is indeed a mistake in the post.. – alpha_989 Apr 17 '18 at 15:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.