I have tool that is able to create a completion file for bash, zsh and fish. I normally use zsh, but i cannot get this completion file to work on zsh. So as a test i installed fish and created the completion file for fish. Also that one i cannot get to work. All other completions are working fine in zsh and in fish, so i suspect that the tool creates a broken completion file. Is there a way to check the syntax of a completion file for errors?
My answer addresses zsh (with the “new” completion system, i.e. after calling
compinit) and bash. For fish, see NotTheDr01ds's answer.
If there is a syntax error in the completion file, you'll see an error message when the completion code is loaded. In bash, this happens when
/etc/bash_completion is loaded. In zsh, this happens the first time the completion function is invoked. But syntax errors are rare. Most errors are not syntax errors, and there's no way to check whether a completion function works other than invoking it.
If an actual error happens while generating the completions, you'll see an error message on the terminal. But if the code doesn't trigger an error, but doesn't generate the desired completions, then there's no error to display.
The first thing to check is whether the completion function you want is actually invoked. For zsh, check
foo is the command whose options/arguments are to be completed. For bash, check
complete -p foo
If you want to debug the completion code, in zsh, press
^X? (Ctrl+X ?) instead of Tab to run
_complete_debug. This places a trace of the completion code into a file which you can view by pressing Up Enter.
There may be more techniques of which I'm not aware, but for
fish, I'd start with:
complete -c <appname>
... to see what completion options have been loaded so far. If you aren't getting any completions, it is likely empty at the moment.
Then move on to:
If there are issues seeing the output on stdout (a likely issue for messages popping up in the middle of a completion), you can specify a filename for the log:
fish --debug='complete' --debug-output=/tmp/fish.log
Also, do you know where the
<toolname>.fish completion function is being generated? It should be in
/usr/share/fish/vendor_completions.d/, I believe. However, there are some other locations that are searched for completion functions.
Once you have the
<toolname>.fish function, I might try:
fish_trace=1 source /path/to/<toolname>.fish
Is there a way to check the syntax of a completion file for errors?
To check a file for syntax errors, you can run it through
fish --no-execute. E.g.
fish --no-execute /path/to/file.fish
However, this won't look inside the
complete statements. E.g. in something like
complete -c mycommand --condition 'banana; && rama' --short f
it won't complain about the
&& rama because it's inside a string that is evaluated later, when the completion is requested.
So, you can run the completions with a fake commandline via
complete --do-complete. E.g.
complete --do-complete="mycommand someoption"
which will print the completion candidates that fish generates for the commandline