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

bag*_*age 3 zsh autocomplete 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
}
Run Code Online (Sandbox Code Playgroud)

我知道别名保持自动完成,但有时需要函数,在这种情况下自动完成会丢失.例如,我想继续git log完成我的功能glmake完成m.

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

有没有办法让ZSH(还有bash)明白打字gl是完全相同的git log?像(仅适用于ZSH):

compctl 'git log' gl
compctl 'make' m 
Run Code Online (Sandbox Code Playgroud)

Tim*_*mur 5

对于zsh,您可以使用compdef函数创建新的完成.

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

$ compdef _make m
Run Code Online (Sandbox Code Playgroud)

根据文档,如果在完成功能中定义了特定服务,您还可以定义特定服务的完成.同样,由于zsh带有_git完成并且它已经定义了git-log服务,gl因此问题中的函数可以自动完成:

$ compdef _git gl=git-log
Run Code Online (Sandbox Code Playgroud)

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