在 bash 中,我使用了这个:
% cat .inputrc
"\e[A": history-search-backward
"\e[B": history-search-forward
我希望在 .zsh 中有相同的行为,所以我尝试了这些绑定键:
"^[[A" history-beginning-search-backward
"^[[B" history-beginning-search-forward
这些几乎是我想要的,除了当我只是向上箭头(没有输入文本)查看紧邻的上一个命令时,光标位于行的开头,而不是末尾。
'bindkey'^[[A'history-search-backward' 很接近,它将光标放在末尾但它只搜索第一个单词,例如,如果我输入 'ssh foo' 它将返回最新的 'ssh'在历史记录中,不是以“ssh foo”开头的最新行。另外,当我进行搜索时,这会将光标定位在行尾,这也不是我想要的(bashhistory-search-backwards
和 zsh都history-beginning-search-backward
将光标保留在我停止输入的位置)
是否可以将光标定位在行尾,具有与 相同的功能history-beginning-search-backward
?
答案1
将其绑定到Up键意味着在编辑多行命令时,您将无法向上移动光标。
这就是为什么绑定到的默认小部件Up是up-line-or-history
,如果您位于第二行或多行命令的下方,它将向上移动光标,否则会从历史记录中调出上一个命令。
要更改这一点,以便在从历史记录中调出上一个命令时,它会调出与光标左侧具有相同前导子字符串的命令,为此有可自动加载的小部件:
for direction (up down) {
autoload $direction-line-or-beginning-search
zle -N $direction-line-or-beginning-search
key=$terminfo[kcu$direction[1]1]
for key ($key ${key/O/[})
bindkey $key $direction-line-or-beginning-search
}
Up(此处查询 terminfo 以获取按或时发送的序列Down,并将其绑定以及O
替换为 的变体,以[
涵盖大多数终端支持的两种键盘传输模式)。
或者,您可以重新定义up/down-line-or-history
小部件以使用这些小部件:
for direction (up down) {
autoload $direction-line-or-beginning-search
zle -N $direction-line-or-{history,beginning-search}
}
这将影响使用这些小部件的所有键映射,包括Up/ Down,但也包括模式中的Ctrl+ P/ 。Nemacs
答案2
在 zsh 中,您可以将键绑定到 shell 函数。 shell 函数必须注册为小部件和zle -N
。它可以访问多个变量,包括缓冲区、剪贴板等的内容。它可以通过zle
内置。
此代码(未经测试)将光标放在 后的行尾history-beginning-search-backward
,但前提是缓冲区最初为空。我不确定这是否正是您想要的,但如果不是,它应该很容易适应。
function history-beginning-search-backward-end-of-line {
local original_buffer_length=$#BUFFER
zle history-beginning-search-backward
if ((original_buffer_length == 0)); then
CURSOR=$#BUFFER
fi
}
zle -N history-beginning-search-backward-end-of-line
bindkey "^[[A" history-beginning-search-backward-end-of-line