与许多 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 模块
- 菜单选择
- ZSH/COMPLIST 模块
要绑定密钥Ctrly以接受完成建议,您可以使用
bindkey ^Y accept-search
文档中有注释
请注意以下内容(复合函数)始终在菜单选择图中执行相同的任务,并且不能被用户定义的小部件替换,也不能扩展功能集:
所以相应地,你不能解除绑定Enter,accept-search
事实上有趣的是命令
bindkey -r ^M accept-search
只成功于解绑 accept-line
从普通命令行。
答案2
您可以绑定另一个键来接受完成建议,以便它仅在菜单完成期间有效:(bindkey -M menuselect <key> accept-search
假设您使用菜单完成)。
另外,如果您想Enter立即执行命令行,而不必按两次才能首先接受完成:bindkey -M menuselect '^M' .accept-line