如何查找 zsh 补全定义

如何查找 zsh 补全定义

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

我知道它们存储在我的 fpath 上的某个位置,我可以执行类似ag $fpath completionname在文件中查找定义之类的操作。有没有更干净的方法,zsh 函数或其他东西来做到这一点?

答案1

该命令的完成函数的名称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 解析源的路径,然后您可以使用whichwhence或 来显示它$functions_source

zmodload zsh/parameter
(($+_comps[foo])) &&
autoload -r $_comps[foo] &&
((+$functions_source[$_comps[foo]])) &&
cat $functions_source[$_comps[foo]]

相关内容