如何查找 zsh 完成定义

ak1*_*k17 2 zsh autocomplete function

有没有办法查找(只需将完成定义打印到标准输出)当前加载的 zsh 完成函数。

我知道它们存储在我的 fpath 的某个地方,我可以做一些事情,比如ag $fpath completionname在文件中找到定义。有没有更干净的方法,zsh 函数或其他方法可以做到这一点?

Gil*_*il' 5

命令的完成函数的名称foo$_comps[foo].

要查看函数的代码myfunc,请运行echo -E $functions[myfunc],或者echo $functions[myfunc]如果您可以bsd_echo选择 或print -rl $functions[myfunc]。因此,要查看命令的完成函数的代码foo,请运行echo -E $functions[$_comps[foo]]. 或者,which $_comps[foo]如果函数名称没有别名,则运行。

这显示了没有注释的代码(并且带有规范化的空格:它是 zsh 内部存储的字节码的人类可读转储)。如果要查看代码中定义的原始文件,请运行whence -v $_comps[foo]echo $functions_source[$_comps[foo]]。该functions_source数组仅在加载模块时zsh/parameter可用(您可以使用zmodload zsh/parameter)并且仅自 zsh 5.4 起可用。

如果你还没有使用过这个函数,你会看到类似的东西builtin autoload -XU而不是代码,并且没有指向源代码的路径。要查看源路径,autoload -r $_comps[foo]请先运行让 zsh 解析源路径,然后您可以使用whichorwhence或显示它$functions_source

zmodload zsh/parameter
(($+_comps[foo])) &&
autoload -r $_comps[foo] &&
((+$functions_source[$_comps[foo]])) &&
cat $functions_source[$_comps[foo]]
Run Code Online (Sandbox Code Playgroud)