zsh:命令名和文件名的单独完成

zsh:命令名和文件名的单独完成

我不希望文件名选项卡补全优先考虑文件名的开头。例如,给定文件名 red_blue.txt 和 blue_red.txt,我不希望 vim redtab优先考虑 red_blue.txt

这可以通过使用来完成:

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'

但是,此行为也适用于命令名称的制表符补全,这是我不希望的。例如,输入 nittab查找命令“nitrogen”也将匹配 mkinitcpio、xinit、compinit 等命令。

对于命令,我希望使用以下完成:

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

如何让 zsh tab 补全以不同的方式处理命令名和文件名?

答案1

一般来说,你需要细化zstyle称呼因此它不适用于所有补全,而仅适用于文件补全。对于普通完成,上下文说明符的语法是。:completion:WIDGET:COMPLETER:COMMAND:ARGUMENT:TAG

  • WIDGET仅由一些特殊的小部件设置,保留通用 ( *)。
  • COMPLETER用于complete正常完成,并且可以为任务(例如自动更正)设置其他值。
  • COMMAND通常是其参数正在完成的命令的名称。更准确地说,是后面的那个词compdef。一些复杂的命令会在完成子命令时更改它。对于 shell 语法中的特殊位置,它是破折号之间的上下文名称,例如命令中第一个单词的或-parameter之后。$-command-
  • ARGUMENT通常类似于argument-3第三个非选项参数或option--foo-1选项的参数--foo
  • TAG由某些完成函数内部使用,通常但并不总是其中之一常规标签名称

zstyle声明,更具体的声明优先于不太具体的声明。

  • 具有较多冒号 ( ) 的声明:比具有较少冒号的声明更具体。
  • 在列数相同的情况下,如果每个用冒号分隔的部分至少与另一个声明中的相应部分一样具体,则该声明至少与另一个声明一样具体。对于每个部分:
    • *比其他任何事情都更具体。
    • 任何带有通配符的内容都比没有通配符的简单字符串更具体。

因此,一般来说,要对命令名称进行例外处理,只需添加另一个zstyle专门与命令相关的声明即可。

然而,有一个转折点:matcher-list是在全球范围内应用,而不是在完成的情况下应用。在你的情况下,只要你只想要一个匹配器,你就可以使用matcher反而。

zstyle ':completion:*' matcher 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
zstyle ':completion:*:*:-command-:*' matcher 'm:{a-zA-Z}={A-Za-z}'

相关内容