Zsh自定义补全:如何实现特定命令的自定义排序?
解决zsh自定义补全排序问题:保持传入顺序或单独禁用排序
我之前也踩过zsh补全排序的坑——默认情况下zsh会自动对_values的补全结果做字典序排序,完全不管你传入的顺序。不过有两个简单的办法可以解决你的需求,要么强制保持你定义的顺序,要么只给目标命令禁用自动排序。
方法一:针对特定命令禁用补全排序
zsh的补全样式系统支持精细化配置,你可以单独给你的自定义命令关闭排序功能,不会影响其他命令的补全行为。
步骤如下:
- 先给你的命令定义补全函数(假设你的命令叫
mycmd):
_mycmd() { _values 'my completions' foo bar } compdef _mycmd mycmd
- 添加一行zstyle配置,关闭这个命令的补全排序:
zstyle ':completion:*:*:mycmd:*' sort false
这样配置后,当你输入mycmd 按Tab时,补全结果就会严格按照你在_values里传入的foo、bar顺序显示,不会被zsh重新排序。
方法二:用_describe代替_values保持顺序
如果你不想额外配置zstyle,也可以换用_describe命令来定义补全选项——_describe默认不会对选项做自动排序,完全遵循你传入的顺序。
修改你的补全函数为:
_mycmd() { # 直接传入选项,保持顺序 _describe 'my completions' foo bar # 如果需要给选项加描述,可以写成键值对形式 # _describe 'my completions' 'foo:第一个选项' 'bar:第二个选项' } compdef _mycmd mycmd
这个方法更直接,不需要额外的样式配置,适合只需要简单补全的场景。
为什么默认会排序?
zsh的补全系统默认全局开启了排序,对应的配置是zstyle ':completion:*' sort true,这就是为什么_values的结果会被自动重排。我们上面的方法要么针对特定命令关闭这个配置,要么换用不排序的补全函数,完美解决你的问题。
内容的提问来源于stack exchange,提问作者Gal
相关产品推荐
相关产品推荐

