zsh 可以完成 2 个阶段吗?

zsh 可以完成 2 个阶段吗?

假设目录中有以下文件:

  • ABC123ABC
  • abc123QWE
  • abc456

现在假设我输入 a 并按 TAB。

在 bash 中,补全通常只会完成 abc 并停止我必须“解析”下一个符号。所以如果我输入 1,我将能够使用下一个 TAB 完成 abc123。

在 zsh 中,至少按照在我的计算机上配置的方式,它将完成整个变体,在本例中是第一个:abc123ABC,并向我提供菜单以将其更改为其他变体。

这通常很好,但是当有很多文件需要完成时,它会变得丑陋且完全无用。通常在这种情况下,通过在“通用”部分后输入几个字符来轻松/简单地缩小选择范围。

我喜欢菜单部分,但我真的更希望它只完成“常用”部分并在第二个 TAB 或使用菜单上完整完成,但仍然不会失去通过输入一个或两个字符来手动缩小选择范围的能​​力。

zsh 中支持类似的东西吗?

答案1

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

autoload -Uz compinstall && compinstall

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

  • 3“用于改变完成的显示和插入方式的样式。”
    • 2“更改完成项的插入方式:...”
      • 1“… 插入任何明确的前缀,而不是直接进入菜单完成”
        • y

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

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

保存后,将产生以下自定义结果:

zstyle ':completion:*' menu select=1
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s

您可能希望通过添加来定制第一个interactive

zstyle ':completion:*' menu select=1 interactive

答案2

另一个解决方案是在您的中添加此行.zshrc

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

这将完全按照您所说的那样运行(添加常用字符,然后新选项卡触发 zsh 列表菜单)。

笔记:如果不起作用,请确保您没有设置该AUTO_LIST选项:

# if the completion is ambiguous, immediately display the list of possible completions
# setopt AUTO_LIST # <- don't set this one

相关内容