Python の readline
を使用する バインディング。たとえば、
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)
公式のモジュール ドキュメントはそれほど詳細ではありません。詳細については readline ドキュメントを参照してください。
cmd のドキュメントに従えば問題ありません
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()
タブ -> タブ -> 送信 -> タブ -> タブ -> f -> タブの出力
(Cmd)
help send
(Cmd) send
[email protected] [email protected] [email protected]
(Cmd) send [email protected]
(Cmd)
質問で「インタープリターではない」と言っているので、python readline などに関する回答は不要だと思います。 (編集 :後から考えると、明らかにそうではありません。うーん。とにかくこの情報は興味深いと思うので、ここに残しておきます. )
私はあなたがこの後にいるかもしれないと思います.
これは、任意のコマンドにシェルレベルの補完を追加し、bash 独自のタブ補完を拡張することに関するものです。
簡単に言えば、可能な補完を生成するシェル関数を含むファイルを作成し、それを /etc/bash_completion.d/
に保存します。 コマンド complete
で登録します .リンクされたページからのスニペットは次のとおりです:
_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
この場合、入力 foo --[TAB]
変数 opts
の値が得られます 、つまり --help
、 --verbose
と --version
.あなたの目的のために、基本的に opts
に入れられる値をカスタマイズする必要があります .
リンクされたページの例を見てください。すべて非常に簡単です。