几个月来,我一直setopt completealiases
在我的.zshrc
.我完全不知道为什么要添加它——大多数其他东西都有注释或者可以从邻近的设置中理解。因此,我已经好几个月没有完成别名的完整制表符了,直到我看到吉尔斯的回答在这里。我试图理解为什么我愚蠢的过去的自己会在没有任何解释的情况下添加它1。
它的预期用例是什么?常用的情况是怎样的?
1我最好的猜测是我认为已启用别名的完整完成,并没有费心去检查文档。
答案1
默认情况下,zsh 在执行完成之前扩展别名。这在大多数情况下都是可取的。有时,当您通过某个别名使用命令时,您可能希望对命令使用不同的完成方式。这种情况很少见,只有当完成系统不够智能,无法确定实际的完成情况,并且需要获得额外的提示时,才会发生这种情况。如果别名更改系统状态,例如alias e1='cd ~/myproject1 && $EDITOR'
(您希望相对于 的文件名完成~/myproject1
,而默认情况下您会获得相对于当前目录的文件名),也可能会发生这种情况。那么你有两个解决方案:
- 设置
complete_aliases
,并为别名定义不同的完成函数。如果这样做,您需要为您定义的所有别名设置完成,这使得它很麻烦。 - 对于需要不同完成的极少数情况,请使用函数而不是别名。 Zsh 不会尝试猜测给定的
foo () { bar --wibble --wobble "$@"; }
, 的完成foo
应该与 after 相同bar --wibble --wobble
。
鉴于需要单独完成的别名很少见,我真的不认为setopt complete_aliases
使用函数来代替。