我怎样才能使用除退出 zsh 的完成菜单/小部件?

我怎样才能使用除退出 zsh 的完成菜单/小部件?

与许多 zsh 用户一样,我配置了完成功能,以便当我在命令提示符下调用完成功能时,会出现一个可以使用方向箭头键导航的菜单。即在我的~/.zshrc

autoload -Uz compinit
compinit

zstyle ':completion:*' menu yes select
zstyle ':completion:*:*:cd:*' menu yes select

如果我想删除目录/var/log/nginx/somewebsite,我将使用补全启动命令,如下所示:

ubuntu% sudo rm -rf /var/l<TAB>
lib/    local/  lock@   log/

我使用方向箭头键导航项目,当光标移到项目上时,方向键会插入到命令行中;一旦选择了所需的选项,点击ENTER“basic”即可退出菜单小部件并将光标返回到命令行。
问题是ENTER用于从完成菜单中接受项目并执行命令,ENTER当我实际执行这些部分完成的命令时,我一直认为我正在接受完成!

我可以将 zsh 的“接受完成建议并退出小部件”命令重新映射到除 之外的其他命令ENTER吗?
例如TAB甚至Ctrl+ y(与 vim 的接受完成键盘映射相同)

答案1

我在中找到了这方面的文档

  • man zshmodules
    • ZSH/COMPLIST 模块
      • 菜单选择

要绑定密钥Ctrly以接受完成建议,您可以使用

bindkey ^Y accept-search

文档中有注释

请注意以下内容(复合函数)始终在菜单选择图中执行相同的任务,并且不能被用户定义的小部件替换,也不能扩展功能集:

所以相应地,你不能解除绑定Enteraccept-search事实上有趣的是命令

bindkey -r ^M accept-search

只成功于解绑 accept-line从普通命令行。

答案2

您可以绑定另一个键来接受完成建议,以便它仅在菜单完成期间有效:(bindkey -M menuselect <key> accept-search假设您使用菜单完成)。

另外,如果您想Enter立即执行命令行,而不必按两次才能首先接受完成:bindkey -M menuselect '^M' .accept-line

相关内容