我有一个工具可以为 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
。