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