ZSH:上下键搜索历史记录?

ZSH:上下键搜索历史记录?

目前,我的 .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

答案1

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

如果您使用的是 Mac,则以下内容适用于 OSX Catalina。

 bindkey "\e[5~" history-search-backward
 bindkey "\e[6~" history-search-forward

答案2

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

如果$key[Up]$key[Down]不能在您的机器上运行,您可以尝试$terminfo[kcuu1]代替$terminfo[kcud1]

答案3

这是记录的行为:

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

答案4

我找到了问题的答案这里,我认为这是完美的。

例如,将这些功能绑定到“Page Up”键和“Page Down”键,然后当我按“Page Up”时,它将使用我开始输入的内容(而不仅仅是第一个单词)搜索历史记录。

即如果您输入sudo ls /etc然后sudo ls会显示sudo ls /etc但不会显示sudo cat...等。

以下是我的 zshrc 的摘录。

## Page UP and Page Down through History
autoload -Uz history-search-end

zle -N history-beginning-search-backward-end \
                history-search-end
zle -N history-beginning-search-forward-end \
                history-search-end
bindkey "\e[5~" history-beginning-search-backward-end
bindkey "\e[6~" history-beginning-search-forward-end

相关内容