zsh:使选项卡退出菜单完成并在最后一个条目上执行完成

Ala*_*lan 5 zsh

我正在尝试从 bash 切换到 zsh,但我发现 zsh 有一个主要的不方便之处。我已取消设置menucomplete选项,绑定tabexpand-or-complete-prefix,并绑定alt-smenu-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

Ala*_*lan 1

嗯,你的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)