zsh History-beginning-search-backwards 未根据需要定位光标

zsh History-beginning-search-backwards 未根据需要定位光标

在 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键意味着在编辑多行命令时,您将无法向上移动光标。

这就是为什么绑定到的默认小部件Upup-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

相关内容