ZSH:向上和向下键的搜索历史?


22

目前,我的.zshrc中包含以下内容:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

但是,这似乎只在空格字符出现之前与我当前输入的内容匹配。例如,sudo ls /将匹配历史记录中以开头的每一行sudo,而我希望它仅匹配与整个输入匹配的行。(即sudo ls /etc匹配,但不匹配sudo cat /var/log/messages

为了获得所需的行为,我需要更改什么?

如果相关,这是我的整个.zshrc:https : //gist.github.com/919566

Answers:


9

这是记录的行为

down-line-or-search
向下移动缓冲区中的一行,或者如果已经在最底行,则在历史记录中向前搜索以缓冲区中第一个单词开头的行。

似乎没有一个可以完全满足您需要的小部件,因此您必须自己制作。以下是定义行为类似于的小部件的方法up-line-or-search,但是使用行的开头(直到光标)而不是第一个单词作为搜索字符串。没有经过真正测试,尤其是在多行输入上。

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

另一种方法是使用history-beginning-search-backward,但仅在光标位于第一行时调用它。未经测试。

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

谢谢,吉尔斯,您的第一个解决方案效果很好,但是有一个问题,希望您能帮助我解决。当我在空输入上调用up-line-或-search-prefix时,它给了我最后一个运行命令-所需的行为。但是,当我再次运行up-line-或-search-prefix时,它将对我输入的第一个字符进行up-line-或-search。是否可以以某种方式更改某些内容,以便在输入为空的情况下按向上箭头将滚动显示我的历史记录?
rps

@rps啊,很奇怪,它正在提取第一个单词,因为缺少了参数(而不是应有的空值)。使用我的编辑版本。
吉尔(Gilles)'所以

33

zsh通过使用以下功能提供此功能

history-beginning-search-backward
history-beginning-search-forward

例如

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

通过
ctrl+ 查找确切的密钥代码vKEY

例如
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown


1
在zprezto [ 1 ]中可以找到可能在不同终端上运行的键码的替代方法。<kbd> Up </ kbd>是$terminfo[kcuu1],<kbd> Down </ kbd>是$terminfo[kcud1]
贾斯汀C

8

2013年的这篇博客文章推荐了几个与光标之前的所有单词匹配的按键绑定。

# Cycle through history based on characters already typed on the line
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(在此答案的早期版本中,我已$terminfo按照博客文章中的其中一项评论中的建议使用。此处列出了一些terminfo值。)


1
zsh还在中提供了这些友好的别名(至少在ubuntu软件包中)/etc/zsh/zshrc,例如$key[Up]
zzxyz

如果使用$terminfo,则需要更改终端模式。看这里
汤姆·黑尔

我已经编辑了答案,以$key[]代替$terminfo[]。我希望这对读者有用!
joeytwiddle

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.