116

Python インタープリター (UNIX 上) で Python オブジェクトのオートコンプリートを設定する方法を認識しています。

  • Google は、これを行う方法の説明について多くのヒットを示しています。
  • 残念ながら、参照が多すぎて、自分が何をする必要があるかを見つけるのが難しく、これは少し異なります。

Pythonで書かれたコマンドラインプログラムで、任意の項目のタブ/オートコンプリートを有効にする方法を知る必要があります。

私の具体的な使用例は、メールを送信する必要があるコマンドライン Python プログラムです。ユーザーが電子メールアドレスの一部を入力したとき (およびオプションで TAB キーを押したとき) に、電子メールアドレスを自動補完できるようにしたいと考えています (アドレスはディスク上にあります)。

Windows または Mac で動作する必要はありません。Linux だけです。

4

9 に答える 9

77

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 ドキュメントを参照してください。

于 2008-10-09T15:01:38.597 に答える
64

cmdのドキュメントに従ってください。問題ありません

import cmd

addresses = [
    '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 addresses


if __name__ == '__main__':
    my_cmd = MyCmd()
    my_cmd.cmdloop()

tab -> tab -> send -> tab -> tab -> f -> tab の出力

(Cmd)
help  send
(Cmd) send
foo@bar.com            here@blubb.com         whatever@wherever.org
(Cmd) send foo@bar.com
(Cmd)
于 2008-10-09T15:08:18.663 に答える
45

質問で「インタープリターではない」と言っているので、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--versionopts

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

于 2008-10-13T09:59:23.950 に答える
15

これは、ephemient hereによって非常に提供されたコードの完全に機能するバージョンです(ありがとう)。

import readline

addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com']

def completer(text, state):
    options = [x for x in addrs if x.startswith(text)]
    try:
        return options[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind("tab: complete")

while 1:
    a = raw_input("> ")
    print "You entered", a
于 2008-10-16T19:26:31.450 に答える
1

投稿された回答は正常に機能しますが、職場で作成したオートコンプリート ライブラリをオープン ソース化しました。本番環境でしばらく使用していますが、高速で安定しており、使いやすいです。デモモードもあるので、単語を入力すると何が得られるかをすばやくテストできます.

インストールするには、次のコマンドを実行するだけです:pip install fast-autocomplete

次に例を示します。

>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3)  # mis-spelling
[['burrito']]

ソース コードについては、https : //github.com/seperman/fast-autocomplete をご覧ください。

そして、これがどのように機能するかの説明です: http://zepworks.com/posts/you-autocomplete-me/

スペルミスを処理し、オプションで単語の重みで並べ替えます。(burritoが よりも重要であるbookとしましょうburrito。より高い「カウント」を指定するとbook、結果の前に最初に表示されます。

Words は辞書であり、各単語はコンテキストを持つことができます。たとえば、「カウント」、単語の表示方法、単語の周りの他のコンテキストなどです。この例では、単語にはコンテキストがありません。

于 2019-03-29T22:36:14.160 に答える