将以下行添加到我的 .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