I am running Ubuntu 13.10 and fish 2.1.0. I want to write myself a Python script to do some tasks from the command line. The script will require command line arguments.
How can I write my script such that fish can request and get possible values for a given argument. The list of potential values is dynamic. That is, it will be determined programatically (e.g. a list of folder names matching some criteria).
The end result I am aiming for is something like:
user@machine ~> myprog argument=fol<TAB>
folder1 folder2 folder3
Where myprog
is my script file, argument
is the argument name and folder1
etc are valid values generated by some function in my script.
Is this possible, and if so how?
Adapted from zanchey's comment on GitHub:
If you have a program myprog
which takes the --_completion
option, you can write a single completion stub for myprog
that looks like this:
complete --command myprog --arguments '(myprog --_completion (commandline -cp)'
Your program will then get invoked as myprog --_completion myprog some arguments here
, and you can respond with the appropriate completions. It should return only the current token that is being completed (you could also pass this to the program with (commandline -ct)
, or tokenise it yourself), followed optionally by a tab and a short description. Multiple completions are separated with new lines.
Notes:
--_completion
is a convention suggested by the python-selfcompletion library, but you can use anything you want, and this answer is not Python-specific
- There is no way to specify the default completion as described in dbarnett/python-selfcompletion#2 (GitHub comment). You would definitely have to make a short stub for each command.
For Python scripts specifically, the following libraries may support fish completions at some point in the future (but they don't yet):
- argcomplete
- python-selfcompletion
You should create a fish autocomplete function for your script as proposed here and source
it or put it inside your ~/.config/fish/completions
folder.
reference: fish docs