我有能够为 bash、zsh 和 fish 创建完成文件的工具。我通常使用 zsh,但我无法让这个完成文件在 zsh 上工作。所以作为一个测试,我安装了fish并为fish创建了完成文件。还有一个我无法上班。所有其他完成在 zsh 和 fish 中都可以正常工作,所以我怀疑该工具会创建一个损坏的完成文件。有没有办法检查完成文件的语法是否有错误?
我有能够为 bash、zsh 和 fish 创建完成文件的工具。我通常使用 zsh,但我无法让这个完成文件在 zsh 上工作。所以作为一个测试,我安装了fish并为fish创建了完成文件。还有一个我无法上班。所有其他完成在 zsh 和 fish 中都可以正常工作,所以我怀疑该工具会创建一个损坏的完成文件。有没有办法检查完成文件的语法是否有错误?
我的回答涉及 zsh(使用“新”完成系统,即在调用之后
compinit
)和 bash。对于鱼,请参阅NotTheDr01ds 的答案。如果完成文件中存在语法错误,您将在加载完成代码时看到一条错误消息。在 bash 中,这发生在
/etc/bash_completion
加载时。在 zsh 中,这发生在第一次调用完成函数时。但语法错误很少见。大多数错误不是语法错误,除了调用它之外,没有其他方法可以检查完成函数是否有效。如果在生成完成时发生实际错误,您将在终端上看到一条错误消息。但是,如果代码没有触发错误,但没有生成所需的完成,则不会显示任何错误。
首先要检查的是是否实际调用了您想要的完成函数。对于 zsh,检查
where
foo
是要完成其选项/参数的命令。对于 bash,请检查如果您的自定义完成功能未加载,请参阅自定义命令的动态 zsh 自动完成或自定义 bash 选项卡完成。
如果要调试完成代码,在 zsh 中,按
^X?
( Ctrl+X ?) 而不是Tab运行_complete_debug
。这会将完成代码的跟踪放入一个文件中,您可以通过按 来查看该文件Up Enter。可能还有更多我不知道的技术,但是对于
fish
,我将从:...查看到目前为止已加载的完成选项。如果您没有得到任何完成,那么它目前可能是空的。
然后继续:
如果在 stdout 上看到输出时出现问题(可能是在完成过程中弹出消息的问题),您可以为日志指定文件名:
另外,你知道
<toolname>.fish
完成函数是在哪里生成的吗?它应该在/usr/share/fish/vendor_completions.d/
,我相信。但是,还有一些其他位置会搜索完成功能。一旦你有了这个
<toolname>.fish
功能,我可能会尝试:要检查文件的语法错误,您可以通过
fish --no-execute
. 例如但是,这不会查看
complete
语句内部。例如在类似的东西它不会抱怨,
&& rama
因为它位于稍后在请求完成时评估的字符串中。因此,您可以通过
complete --do-complete
. 例如这将打印fish为命令行生成的完成候选
mycommand someoption
。