zsh 中 COMPLETE_ALIASES 的预期用例是什么?

mur*_*uru 5 zsh alias autocomplete

几个月来,我已经setopt completealiases在我的.zshrc. 我不知道为什么要添加它 - 大多数其他事情都有评论或可以从相邻的设置中理解。正因为如此,几个月来我一直没有完成别名的完整选项卡完成,直到我在这里看到Gilles 的回答。我试图理解为什么我愚蠢的过去自己会在没有任何解释的情况下添加它1

它的预期用例是什么?一般是怎么使用的?


1我最好的猜测是我认为它启用了别名的完整完成并且没有费心检查文档。

Gil*_*il' 6

默认情况下,zsh 在执行完成之前扩展别名。大多数时候这是可取的。有时,当您通过某个别名使用某个命令时,您可能希望对它使用不同的补全。这种情况很少见,而且只有在补全系统不够智能而无法确定实际补全并且需要获得额外提示时才会发生。如果别名更改了系统状态,也可能发生这种情况,例如alias e1='cd ~/myproject1 && $EDITOR'(您希望文件名完成相对于~/myproject1,而默认情况下,您将获得相对于当前目录的文件名)。那么你有两个解决方案:

  • 设置complete_aliases,并为别名定义不同的完成函数。如果你这样做,你需要为你定义的所有别名设置完成,这使得它很麻烦。
  • 对于需要不同完成的极少数情况,请使用函数而不是别名。Zsh 不会试图猜测给定的foo () { bar --wibble --wobble "$@"; },完成的foo应该与之后相同bar --wibble --wobble

鉴于需要单独完成的别名很少见,我真的看不出有什么意义setopt complete_aliases- 改用函数。