Zsh 函数:将完成转发到子函数

Zsh function: forward completion to subfunction

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

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

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

完成 make

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

有没有办法让 ZSH(还有 bash)理解键入 glgit log 完全相同?类似的东西(仅适用于 ZSH):

compctl 'git log' gl
compctl 'make' m 

对于 zsh,您可以使用 compdef 函数创建一个新的补全。

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

$ compdef _make m

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

$ compdef _git gl=git-log

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