当完成菜单打开时,如何重复 zle 小部件任意次数?

当完成菜单打开时,如何重复 zle 小部件任意次数?

我正在使用zshshell,并且尝试安装一些键绑定,以便在打开完成菜单时使用与我在 Vim 缓冲区中使用的键类似的键。

因此,在键盘映射内部,我通过在内部添加以下行,menuselect将键j和绑定kzle小部件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-historyup-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重复多次?5C-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 步,一次移动一步。

相关内容