我正在尝试从 bash 切换到 zsh,但我发现 zsh 有一个主要的不方便之处。我已取消设置menucomplete
选项,绑定tab
到expand-or-complete-prefix
,并绑定alt-s
到menu-complete
。
但是,一旦我通过按 调用菜单完成alt-s
,随后点击tab
将继续循环浏览菜单完成条目,而不是像 bash 那样退出菜单完成并在最后显示的条目上执行完成。我想要这个的主要原因是,如果我想要cd
/ls
进入多个嵌套目录,我可以快速“进入”最后显示的目录。
我使用的是 zsh 版本 5.8,并且在我的 ~/.zshrc 中有以下内容:
setopt autolist
unsetopt automenu autoremoveslash listambiguous menucomplete
bindkey '^i' expand-or-complete-prefix # Bind tab
bindkey '^[s' menu-complete # Bind alt-s to menu-complete
Run Code Online (Sandbox Code Playgroud)
这是一个工作示例:
$ mkdir dir dir/a dir/b dir/b/d dir/c
$ ls dir/ <alt-s>
$ ls dir/a/ <alt-s>
$ ls dir/b/ <tab>
$ ls dir/c/ <tab>
$ ls dir/a/ <tab>
$ ls dir/b/ <tab>
$ ls dir/c/
...etc.
Run Code Online (Sandbox Code Playgroud)
相反,我想像bash 一样tab
“进入” :dir/b/
$ ls dir/ <alt-s>
$ ls dir/a/ <alt-s>
$ ls dir/b/ <tab>
$ ls dir/b/d/ <-- Pressing tab exits menu-complete and immediately goes into the currently displayed directory.
Run Code Online (Sandbox Code Playgroud)
有谁知道我如何才能获得这种行为?非常感谢你的帮助!
编辑:
我通过将以下内容添加到 ~/.zshrc 找到了一个稍微缓解的解决menuselect
方案zsh/complist
:
zmodload -i zsh/complist
bindkey -M menuselect '^i' accept-line
zstyle ':completion:*' menu select=1
Run Code Online (Sandbox Code Playgroud)
现在,在操作tab
过程中按menu-complete
退出menu-complete
。但是,它不会“进入”最后显示的目录,我必须按tab
再次按才能在最后显示的目录中执行自动完成。因此,在 zsh 中按两次tab
而不是在 bash 中按一次即可获得相同的功能。
请注意,有一个不同的menuselect
选项:
bindkey -M menuselect '^i' accept-and-infer-next-history
Run Code Online (Sandbox Code Playgroud)
只需按一下即可“进入”最后显示的目录tab
,但menu-select
在该目录中执行而不是正常执行tab
我想要的那样正常完成。
如果有人知道我如何只需按一下按键即可获得此功能tab
,我将不胜感激。是否可以为 编写自定义 zle 命令menuselect
,例如accept-and-complete-next-history
?
嗯,你的zsh-autocomplete
插件看起来很有趣,马龙先生,必须检查一下。
无论如何,我找到了解决原始问题的方法。基本上,我只是创建了一个简单的小部件来执行我想要的操作。在~/.zshrc中:
zmodload -i zsh/complist
accept-and-complete-next-history() {
zle expand-or-complete-prefix
}
zle -N accept-and-complete-next-history
bindkey -M menuselect '^i' accept-and-complete-next-history
zstyle ':completion:*' menu select=1
Run Code Online (Sandbox Code Playgroud)
或者等价地:
zmodload -i zsh/complist
bindkey -M menuselect '^i' .expand-or-complete-prefix
zstyle ':completion:*' menu select=1
Run Code Online (Sandbox Code Playgroud)