GNU/Linux >> Linux の 問題 >  >> Linux

インタープリターではなく任意のものをPythonのコマンドラインプログラムでオートコンプリートする方法

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 に入れられる値をカスタマイズする必要があります .

リンクされたページの例を見てください。すべて非常に簡単です。


Linux
  1. プログラムは、カラー出力を使用するかどうかをどのように決定しますか?

  2. Teeコマンドでプログラムを機能させる方法は?

  3. プログラムをどこからでも実行可能にする方法は?

  1. Gnomeでのみプログラムを自動起動させる方法は?

  2. Python Hello World の例:Unix OS で Python プログラムを作成して実行する方法

  3. shell=True で起動された Python サブプロセスを終了する方法

  1. Pythonスクリプトをサービスとして実行するには?

  2. Linux で Python モジュールをシステム全体で利用できるようにするにはどうすればよいですか?

  3. polyml インタープリターに readline サポートを追加するには?