有没有办法查找(只需将完成定义打印到标准输出)当前加载的 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 解析源的路径,然后您可以使用which
或whence
或 来显示它$functions_source
。
zmodload zsh/parameter
(($+_comps[foo])) &&
autoload -r $_comps[foo] &&
((+$functions_source[$_comps[foo]])) &&
cat $functions_source[$_comps[foo]]