Použijte readline
Pythonu vazby. Například,
import readline
def completer(text, state):
options = [i for i in commands if i.startswith(text)]
if state < len(options):
return options[state]
else:
return None
readline.parse_and_bind("tab: complete")
readline.set_completer(completer)
Oficiální dokumenty modulu nejsou o mnoho podrobnější, další informace najdete v readline docs.
Postupujte podle dokumentace cmd a budete v pořádku
import cmd
addresses = [
'[email protected]',
'[email protected]',
'[email protected]',
]
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 addresses
if __name__ == '__main__':
my_cmd = MyCmd()
my_cmd.cmdloop()
Výstup pro kartu -> kartu -> odeslat -> kartu -> kartu -> f -> kartu
(Cmd)
help send
(Cmd) send
[email protected] [email protected] [email protected]
(Cmd) send [email protected]
(Cmd)
Protože ve své otázce říkáte „NOT interpreter“, myslím, že nechcete odpovědi zahrnující python readline a podobně. (upravit :při zpětném pohledu tomu tak zjevně není. Ho hukot. Myslím, že tyto informace jsou každopádně zajímavé, takže je zde nechám. )
Myslím, že bys mohl být po tomhle.
Jde o přidání dokončování na úrovni shellu k libovolným příkazům a rozšíření vlastního dokončování tabel v bash.
Stručně řečeno, vytvoříte soubor obsahující funkci shell, která vygeneruje možná dokončení, uložte jej do /etc/bash_completion.d/
a zaregistrujte jej pomocí příkazu complete
. Zde je úryvek z odkazované stránky:
_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
V tomto případě zadejte foo --[TAB]
vám dá hodnoty v proměnné opts
, tj. --help
, --verbose
a --version
. Pro vaše účely budete v podstatě chtít upravit hodnoty, které se vkládají do opts
.
Podívejte se na příklad na odkazované stránce, je to všechno docela jednoduché.