Zsh功能:向前完成到子功能

时间:2016-12-01 11:22:48

标签: autocomplete zsh bash-completion zsh-completion

很多时候我最终会围绕现有函数编写包装函数,例如:

function gl {
    some_computed_stuff=...
    git --no-pager log --reverse $some_computed_stuff "$@"
}
function m {
    make "$@" && notify-send success || notify-send failed
}

我知道别名保持自动完成,但有时需要函数,在这种情况下自动完成会丢失。 例如,我希望git log完成glmake完成m

我尝试添加compctl -K _git gl,但没有提出任何建议。它无论如何都不会工作,因为我必须以某种方式找到如何为log自动完成脚本提供_git参数,所以我的问题是:

有没有办法让ZSH(还有bash)明白打字glgit log完全相同?像(仅限ZSH):

compctl 'git log' gl
compctl 'make' m 

1 个答案:

答案 0 :(得分:5)

对于zsh,您可以使用compdef功能创建新的完成。

在其基本形式中,它将完成函数与单词相关联。如果zsh带有许多已经内置的完成,那么可以重用它们。例如,对于问题中的m函数:

$ compdef _make m

根据文档,如果在完成功能中定义了特定服务,您还可以定义特定服务的完成。同样,由于zsh随_git完成而已定义git-log服务,因此问题中的gl函数可能会自动填充:

$ compdef _git gl=git-log

在Linux上,您可以在/usr/share/zsh/functions/Completion/Unix/中看到现有的完成实现。您可以阅读完成实现以查看它们定义的服务。