我使用 zsh 和“新”补全系统 ( compinit
)。有时我想将完成限制为可能的子集,以减少歧义。这是用户选择,而不是配置设置:我想按不同的键而不是Tab获得不同的完成集。我不想为该命令配置不同的完成。Tab应该还是做正常的事情。
在某些情况下,有一些解决方法。例如,我有一个绑定到 的键_bash_complete-word
,在大多数情况下它会完成文件。但有时我想要一个不太常见的焦点。例如:
- 仅在 后填写主机名
scp
,而不是本地文件名。 - 仅在 后填写远程名称
git checkout
,而不是分支名称。
如何绑定一个键,该键将在 后完成远程名称git checkout
,但不完成分支名称?更一般地说,如何绑定一个键来完成与当前上下文中通常完成的事情不同的事情?
答案1
下面的代码片段会导致Meta+r在 git 命令行上完成 git 远程名称,并在其他地方完成主机名。
_complete-remotes () {
case $words[1] in
git) load_helper_functions _git; __git_remotes;;
*) _hosts;;
esac
}
compdef -k _complete-remotes complete-word '^[r'
- 看我可以在另一个 ZSH 完成文件中使用辅助函数吗为了
load_helper_functions
。如果您从上面的代码中删除它,则只有git
在当前 zsh 会话中之前至少执行过一次完成时,它才会起作用。 $words[1]
是要完成的带有参数的命令的第一个单词。complete -k …
将函数注册_complete-remotes
为完成小部件(允许它运行完成内置函数)并将其绑定到Meta+ r。