默认情况下,zsh的完成引擎仅尝试将某些内容附加到您键入的内容上。您将其配置为尝试添加前缀。简单的交互式完成配置引擎(compinstall)在“匹配控制→子字符串完成”下提供了此功能。这样会在您的中插入一行.zshrc:
zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*'
该zstyle内置集(主要)完成设置。在matcher-list完成风格的方式相继尝试列表,停车时至少有一个匹配。空字符串表示默认完成(仅后缀)。该匹配控制咒语l:|=* r:|=*手段尝试前缀匹配*和后缀匹配*,即任何前缀和后缀。
您可以禁止以开头的前缀_。这仍然允许以开头的单词的完成_,以及通过添加前缀来完成的前缀,但是前缀不能以开头_。
zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*'
这适用于所有补全,而不仅仅是命令名的补全。我不知道如何将其限制为命令名称。
应该有一种方法可以更精确地排除以开头的命令名_,但是我不知道如何。首先是ignored-patterns完成风格。
zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*'
这不包括以_; 开头的匹配;但是,如果没有匹配项,则zsh会在没有忽略规则的情况下再次尝试。这样做的好处是,如果命令首先以下划线开头,那么它将在第二遍完成。糟糕的是,如果没有匹配项,zsh将因此尝试尝试添加下划线,因此,如果有vi,view但没有,vim则按Tabafter vi将提供vi,view但没有_vim,但如果您键入,vim则完成将提供_vim。