我正在使用zsh
shell,并且尝试安装一些键绑定,以便在打开完成菜单时使用与我在 Vim 缓冲区中使用的键类似的键。
因此,在键盘映射内部,我通过在内部添加以下行,menuselect
将键j
和绑定k
到zle
小部件down-line-or-history
和:up-line-or-history
~/.zshrc
bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'k' up-line-or-history
down-line-or-history
并up-line-or-history
描述man zshzle
如下:
down-line-or-history (^N ESC-[B) (j) (ESC-[B)
Move down a line in the buffer, or if already at the bottom line, move to the next event in the his‐
tory list.
up-line-or-history (^P ESC-[A) (k) (ESC-[A)
Move up a line in the buffer, or if already at the top line, move to the previous event in the history
list.
现在,我想将C-d
和绑定C-u
到相同的小部件,但重复它们任意次数,例如5
。
起初我尝试了这个简单的代码:
some-widget() {
zle backward-char -n 5
}
zle -N some-widget
bindkey '^D' some-widget
它绑定C-d
到 zle widget backward-char
,但会重复5
多次。
然后,我尝试重写代码,将键绑定从默认键盘映射移动到键盘menuselect
映射:
some-widget() {
zle backward-char -n 5
}
zle -N some-widget
bindkey -M menuselect '^D' some-widget
但它并没有像我预期的那样工作,因为当我C-d
在完成菜单打开时点击时,zle
似乎执行了绑定到的默认小部件C-d
,即delete-char-or-list
:
delete-char-or-list (^D) (unbound) (unbound)
Delete the character under the cursor. If the cursor is at the end of the line, list possible comple‐
tions for the current word.
它退出当前完成菜单,并列出当前单词可能的完成,而不是将光标向后移动5
几次。
如果它按我的预期工作,我可能最终会使用这个最终代码:
fast-down-line-or-history() {
zle down-line-or-history -n 5
}
zle -N fast-down-line-or-history
bindkey -M menuselect '^D' fast-down-line-or-history
fast-up-line-or-history() {
zle up-line-or-history -n 5
}
zle -N fast-up-line-or-history
bindkey -M menuselect '^U' fast-up-line-or-history
但既然没有,我需要找到如何zle
在打开完成菜单时重复小部件。
如何修改前面的代码,以便在完成菜单打开时点击时down-line-or-history
重复多次?5
C-d
答案1
您的代码不起作用,因为小部件“始终在菜单选择图中执行相同的任务,并且不能被用户定义的小部件替换,也不能扩展功能集”。
然而,以下做工作:
bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'k' up-line-or-history
bindkey -M menuselect -s '^D' 'jjjjj'
bindkey -M menuselect -s '^U' 'kkkkk'
该-s
选项允许您指定将输入到 Zsh 行编辑器 (ZLE) 的文字字符串,就像您自己键入一样。所以,现在,当您按 时ctrlD,将为j您按五次,为您提供所需的效果。
但请注意,它并不是特别快。我确实可以看到光标向上或向下移动 5 步,一次移动一步。