zsh 可以做 2 阶段完成吗?

Vit*_*ner 7 zsh autocomplete

假设我在目录中有以下文件:

  • abc123ABC
  • abc123QWE
  • abc456

现在假设我输入 a 并点击 TAB。

在 bash 中,它通常工作的完成只会完成 abc 并停止我不得不“解决”下一个符号。因此,如果我输入 1,我将能够使用下一个 TAB 完成 abc123。

在 zsh 中,至少在我的机器上配置它的方式中,它将完成整个变体,在这种情况下是第一个:abc123ABC 并向我展示菜单以将其更改为其他变体。

这通常是好的,但是当有很多文件要完成时,结果很丑陋而且完全没用。通常在这种情况下,通过在“公共”部分后键入几个字符来缩小选择范围会很容易/微不足道。

我喜欢菜单部分,但我真的更喜欢它只完成“常见”部分并在第二个 TAB 或使用菜单上完整完成,但仍然无法通过键入字符或二。

zsh 中是否支持类似的东西?

Chr*_*sen 10

您应该探索compinstall完成定制程序。

autoload -Uz compinstall && compinstall
Run Code Online (Sandbox Code Playgroud)

在我使用的版本 ( zsh 4.3.10) 中,插入明确前缀的选项位于以下菜单中

  • 3 “用于更改完成显示和插入方式的样式。”
    • 2 “更改补全的插入方式:……”
      • 1 “……插入任何明确的前缀,而不是 [going] 直接到菜单完成”
        • y

保存后,将导致以下命令保存到完成自定义文件(通常为.zshrc):

zstyle ':completion:*' insert-unambiguous true
Run Code Online (Sandbox Code Playgroud)
  • 3 “用于更改完成显示和插入方式的样式。”
    • 3 “配置……完成列表、项目选择……”
      • 2 “使用光标键从完成列表中选择完成。”
        • 1
        • Return

保存后,这将导致以下自定义:

zstyle ':completion:*' menu select=1
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
Run Code Online (Sandbox Code Playgroud)

您可能希望通过添加interactive以下内容来自定义第一个:

zstyle ':completion:*' menu select=1 interactive
Run Code Online (Sandbox Code Playgroud)