58

I have recently switched to zsh, using robbyrussell's oh-my-zsh. Before that i used bash with a lot of custom stuff and i am only missing one thing because zsh is trying to be 'too smart':

If i type git commit and then zsh goes through all recent git commands. What i really want though, is going through all commands that start with git commit (not just git).

How can i achieve this behavior in (oh-my-)zsh?

Gilles 'SO- stop being evil'
  • 69,786
  • 21
  • 137
  • 178
Patrick Oscity
  • 1,769
  • 1
  • 15
  • 19

2 Answers2

81

I have found the solution to my problem in the ZSH documentation. Oh-my-zsh seems to map the and Keys to something like

bindkey '\e[A' history-search-backward
bindkey '\e[B' history-search-forward

Which yields the exact behavior I described above. The ZSH Documentation describes the behavior of history-search-backward as

Search backward in the history for a line beginning with the first word in the buffer.



What I wanted instead was the following mapping, which I inserted into my ~/.zshrc:

bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward

The behavior of history-beginning-search-backward is as follows:

Search forward in the history for a line beginning with the current line up to the cursor. This leaves the cursor in its original position.

Also, if \e[A doesn't work for the up or down arrows, press <ctrl-v><KEY (e.g., up arrow)> in another terminal which gives ^[OA. Then you can use this instead of \e[A. The process is described here: http://zshwiki.org/home/zle/bindkeys

Patrick Oscity
  • 1,769
  • 1
  • 15
  • 19
  • 2
    Thank you thank you thank you!! I was going nuts over this – mhenrixon Mar 19 '14 at 11:46
  • For non-OMZ user like me: `bindkey` doesn't do anything real, due to a bug, so OMZ team patched it with [this plugin](https://github.com/robbyrussell/oh-my-zsh/blob/3477ff25274fa75bd9e6110f391f6ad98ca2af72/plugins/safe-paste/safe-paste.plugin.zsh). Simply download it and source it before `bindkey`. – Franklin Yu Nov 25 '16 at 15:22
  • @FranklinYu you do realize that's total bs, right? that plugin doesn't do anything with bindkey except USE it to catch some events. – nonchip Jul 25 '18 at 18:38
  • Wow, this is perfect! – Squirrel Sep 07 '18 at 08:48
  • Just an FYI that the link provided is a 404. Try https://zshwiki.org/home/keybindings/ instead. Cheers. – sming Apr 02 '22 at 16:08
15

I wanted the same behaviour for zsh with oh-my-zsh installed and found plugin history-substring-search.

I achieved the same behaviour described above by adding the plugin to my ~/.zshrc:

plugins=(git brew npm history-substring-search)

I guess this plugin did not exist back when this question was raised. Just an alternate way to achieve the same thing.

slowdownitsfine
  • 151
  • 1
  • 3