为什么使用历史记录的 zsh 自动完成从登录到登录的行为不一致?

为什么使用历史记录的 zsh 自动完成从登录到登录的行为不一致?

将以下行添加到我的 .zshrc 后:

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 "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search

我运行exec zsh(从 zsh),上面的行没有生效。然后,我执行了以下操作(不确定此上下文是否必要,但可能相关): exit将我放回登录 shell (bash),exit注销,然后ssh machine重新登录,然后exec zsh,然后上面的行开始工作。

有谁知道为什么?

编辑

我的标题问题不正确。事实证明,.zsh 仅在上述几行上从登录到登录时表现不一致。有时它们按预期工作,有时则不然。我试图找到一种模式,但没有找到。我想(但不确定)登录很关键,因为一旦我ssh进入机器,无论 zsh 实例不同,行为似乎都保持不变。

from 的输出read (up) (down)始终与 from 的输出相同history 0,并且向上和向下箭头似乎表现良好。

对于失败的情况,可能是有用的信息,也可能不是有用的信息(我已经有一段时间无法让它工作了):

%bindkey | grep 'or-beginning'
"^[[A" up-line-or-beginning-search
"^[[B" down-line-or-beginning-search
%zmodload | grep zle
zsh/zle
%up-line-or-beginning-search
up-line-or-beginning-search:zle:19: widgets can only be called when ZLE is active
up-line-or-beginning-search:zle:21: widgets can only be called when ZLE is active
%read
^[[A^[[B^C% (up,down,ctrl-c)

答案1

% echo echo echo >> ~/.zshrc
% exec zsh
echo
% 

所以 anexec zsh确实运行了echo刚刚添加到的~/.zshrc.也许跑

zsh -ixc exit >grepthis 2>&1

然后检查grepthis文件是否读取了您的行,或者bindkey之后是否发生了其他相关的事情,或者...

答案2

我仍然不知道为什么它有时会起作用,但以下内容对我有帮助: http://zshwiki.org/home/zle/bindkeys

'<ctrl-v><up>'(而不是"^[[A")作为键序列可以解决问题。幸运的是,它在 vim 中也能工作。

<ctrl-v><up>序列可打印,但不可直接键入: 0x1B 0x4F 0x42

另外,(正如文章中还提到的),对于我的系统中定义的一些更简单的键,有友好的绑定/etc/zsh/zshrc

因此在我的系统上,以下操作也有效:

bindkey "$key[Up]" up-line-or-beginning-search

相关内容