Zsh 完成:如何找到用于完成特定命令的函数?

Zsh completion: How to find the function that is used for completions with a specific command?

我正在为我写的 shell script/program 写一个 zsh 补全函数。在完成过程中的某个时刻,我想使用另一个命令的完成功能来处理剩余的完成。

如何找出特定命令的完成函数被调用?如何在我的 shell 中查找现有的 compdef 作业?

背景

我的程序包装了 nvim 并且在我的 shell 中没有 _nvim 函数,我猜它是完成函数。所以我假设 nvim 使用的完成函数实际上是 _vim 但是这个问题更笼统以便学习。

只需键入命令加上 space,然后按 CtrlX,然后按 H到运行到_complete_help widget。例如:

% nvim # press ^Xh here
tags in context :completion::complete:nvim::
    argument-rest options  (_arguments _vim)
tags in context :completion::complete:nvim:argument-rest:
    globbed-files  (_files _vim_files _arguments _vim)

这告诉您对于输入 nvim ,完成系统将调用 _vim,然后调用 _arguments,添加 argument-restoptions完成。然后,_arguments 调用 _vim_files,后者调用 _files,后者添加 globbed-files 完成。

或者,如果您只对传递给 compdef 的顶级完成函数感兴趣,只需这样做:

% print $_comps[nvim]
_vim