How to make a python, command-line program autocomplete arbitrary things NOT interpreter How to make a python, command-line program autocomplete arbitrary things NOT interpreter unix unix

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.