假设目录中有以下文件:
- 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
- 1“… 插入任何明确的前缀,而不是直接进入菜单完成”
- 2“更改完成项的插入方式:...”
一旦保存,这将导致以下命令保存到完成自定义文件中(通常为.zshrc
):
zstyle ':completion:*' insert-unambiguous true
- 3“用于改变完成的显示和插入方式的样式。”
- 3“配置……完成列表、项目选择……”
- 2“使用光标键从完成列表中选择完成。”
- 1
- Return
- 2“使用光标键从完成列表中选择完成。”
- 3“配置……完成列表、项目选择……”
保存后,将产生以下自定义结果:
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