How to make a python, command-line program autocomplete arbitrary things NOT interpreter
Use Python's readline
bindings. For example,
import readlinedef completer(text, state): options = [i for i in commands if i.startswith(text)] if state < len(options): return options[state] else: return Nonereadline.parse_and_bind("tab: complete")readline.set_completer(completer)
The official module docs aren't much more detailed, see the readline docs for more info.
Follow the cmd documentation and you'll be fine
import cmdaddresses = [ 'here@blubb.com', 'foo@bar.com', 'whatever@wherever.org',]class MyCmd(cmd.Cmd): def do_send(self, line): pass def complete_send(self, text, line, start_index, end_index): if text: return [ address for address in addresses if address.startswith(text) ] else: return addressesif __name__ == '__main__': my_cmd = MyCmd() my_cmd.cmdloop()
Output for tab -> tab -> send -> tab -> tab -> f -> tab
(Cmd)help send(Cmd) sendfoo@bar.com here@blubb.com whatever@wherever.org(Cmd) send foo@bar.com(Cmd)
Since you say "NOT interpreter" in your question, I guess you don't want answers involving python readline and suchlike. (edit: in hindsight, that's obviously not the case. Ho hum. I think this info is interesting anyway, so I'll leave it here.)
I think you might be after this.
It's about adding shell-level completion to arbitrary commands, extending bash's own tab-completion.
In a nutshell, you'll create a file containing a shell-function that will generate possible completions, save it into /etc/bash_completion.d/
and register it with the command complete
. Here's a snippet from the linked page:
_foo() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--help --verbose --version" if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi}complete -F _foo foo
In this case, the typing foo --[TAB]
will give you the values in the variable opts
, i.e. --help
, --verbose
and --version
. For your purposes, you'll essentially want to customise the values that are put into opts
.
Do have a look at the example on the linked page, it's all pretty straightforward.