有没有办法验证完成文件?

有没有办法验证完成文件?

我有一个工具可以为 bash、zsh 和 Fish 创建完成文件。我通常使用 zsh,但我无法让这个完成文件在 zsh 上工作。因此,作为测试,我安装了fish并为fish创建了完成文件。还有那个我无法上班。所有其他补全在 zsh 和 Fish 中都工作正常,因此我怀疑该工具创建了损坏的补全文件。有没有办法检查完成文件的语法是否有错误?

答案1

我的答案涉及 zsh (使用“新”完成系统,即调用后compinit)和 bash。对于鱼,请参见NotTheDr01ds 的回答

如果完成文件中存在语法错误,则在加载完成代码时您将看到一条错误消息。在 bash 中,这种情况发生在/etc/bash_completion加载时。在 zsh 中,这是第一次调用完成函数时发生的。但句法错误很少见。大多数错误都不是语法错误,除了调用完成函数之外,没有其他方法可以检查它是否有效。

如果在生成补全时发生实际错误,您将在终端上看到一条错误消息。但是,如果代码没有触发错误,但没有生成所需的完成,则不会显示错误。

首先要检查的是您想要的完成函数是否实际被调用。对于 zsh,请检查

echo $_comps[foo]

其中foo是要完成其选项/参数的命令。对于 bash,请检查

complete -p foo

如果您的自定义完成函数未加载,请参阅自定义命令的动态 zsh 自动完成或者自定义 bash 选项卡完成

如果要调试完成代码,在 zsh 中,按^X?( Ctrl+X ?) 而不是Tab运行_complete_debug。这会将完成代码的跟踪记录到一个文件中,您可以通过按 查看该文件Up Enter

答案2

可能还有更多我不知道的技术,但对于fish,我会从以下开始:

complete -c <appname>

...查看到目前为止已加载的完成选项。如果您没有获得任何完成,那么目前它可能是空的。

然后继续:

fish --debug=complete

如果在标准输出上查看输出时出现问题(完成过程中弹出消息可能会出现问题),您可以为日志指定文件名:

fish --debug='complete' --debug-output=/tmp/fish.log

另外,你知道<toolname>.fish补全函数是在哪里生成的吗?它应该我相信/usr/share/fish/vendor_completions.d/。然而,有一些其他地点搜索补全函数。

一旦你有了这个<toolname>.fish功能,我可能会尝试:

fish_trace=1 source /path/to/<toolname>.fish

答案3

有没有办法检查完成文件的语法是否有错误?

要检查文件是否存在语法错误,您可以通过运行它fish --no-execute。例如

fish --no-execute /path/to/file.fish

但是,这不会查看complete语句内部。例如在类似的事情中

complete -c mycommand --condition 'banana; && rama' --short f

它不会抱怨 ,&& rama因为它位于稍后在请求完成时评估的字符串内。

因此,您可以通过以下方式使用假命令行运行补全complete --do-complete。例如

 complete --do-complete="mycommand someoption"

这将打印fish为命令行生成的完成候选mycommand someoption

相关内容