web-dev-qa-db-ja.com

Pythonでオートコンプリートをコーディングする方法は?

Linuxターミナルでオートコンプリートをコーディングしたいと思います。コードは次のように動作するはずです。

文字列のリストがあります(例: "hello、" hi "、" how are you "、" goodbye "、" great "、...)。

ターミナルでは、ユーザーは入力を開始し、一致する可能性がある場合、可能な文字列のヒントを取得し、そこから選択することができます( vim editor または googleインクリメンタル検索)と同様 )。

例えば彼は「h」と入力し始め、ヒントを得る

こんにちは"

_ "私"

_「お元気ですか」

さらに良いのは、最初からだけでなく、文字列の任意の部分から単語を補完する場合です。

アドバイスありがとうございます。

32
xralf

(これはまさにあなたが求めているものではないことを知っていますが)に表示されるオートコンプリート/提案に満足している場合 TAB (多くのシェルで使用されています)、 readline モジュールを使用すると、すぐに起動して実行できます。

readlineに関するDoug HellmannのPyMOTWの記事 に基づく簡単な例を示します。

import readline

class MyCompleter(object):  # Custom completer

    def __init__(self, options):
        self.options = sorted(options)

    def complete(self, text, state):
        if state == 0:  # on first trigger, build possible matches
            if text:  # cache matches (entries that start with entered text)
                self.matches = [s for s in self.options 
                                    if s and s.startswith(text)]
            else:  # no text entered, all matches possible
                self.matches = self.options[:]

        # return match indexed by state
        try: 
            return self.matches[state]
        except IndexError:
            return None

completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')

input = raw_input("Input: ")
print "You entered", input

これにより、次の動作(<TAB>押されているタブキーを表します):

Input: <TAB><TAB>
goodbye      great        hello        hi           how are you

Input: h<TAB><TAB>
hello        hi           how are you

Input: ho<TAB>ow are you

最後の行(HOTAB 入力)、一致する可能性のあるものは1つだけで、「how are you」という文全体が自動補完されます。

readlineの詳細については、リンクされた記事をご覧ください。


「さらに良いのは、最初からだけでなく、文字列の任意の部分からの補完だけでなく、単語を補完する場合です。」

これは、コンプリーター関数の一致基準を変更するだけで実現できます。から:

self.matches = [s for s in self.options 
                   if s and s.startswith(text)]

次のようなものに:

self.matches = [s for s in self.options 
                   if text in s]

これにより、次の動作が得られます。

Input: <TAB><TAB>
goodbye      great        hello        hi           how are you

Input: o<TAB><TAB>
goodbye      hello        how are you

更新:履歴バッファーの使用(コメントに記載)

スクロール/検索用の擬似メニューを作成する簡単な方法は、キーワードを履歴バッファーにロードすることです。その後、上/下矢印キーを使用してエントリをスクロールし、使用することができます Ctrl+R 逆検索を実行します。

これを試すには、次の変更を行います。

keywords = ["hello", "hi", "how are you", "goodbye", "great"]
completer = MyCompleter(keywords)
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
for kw in keywords:
    readline.add_history(kw)

input = raw_input("Input: ")
print "You entered", input

スクリプトを実行するときに、入力してみてください Ctrl+r に続く a。これは、「a」を含む最初の一致を返します。入る Ctrl+r 再び次の試合に向けて。エントリを選択するには、を押します ENTER

また、上/下キーを使用してキーワードをスクロールしてみてください。

45
Shawn Chin

ユーザーがキーを押す必要があると思います。

次のような方法でそれを実現できます(Enterキーを押さずに)。

import termios, os, sys

def getkey():
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
    new[6][termios.VMIN] = 1
    new[6][termios.VTIME] = 0
    termios.tcsetattr(fd, termios.TCSANOW, new)
    c = None
    try:
        c = os.read(fd, 1)
    finally:
        termios.tcsetattr(fd, termios.TCSAFLUSH, old)
    return c

次に、このキーがタブキー(たとえば、実装する必要があるもの)である場合、すべての可能性をユーザーに表示します。それが他のキーである場合は、標準出力に印刷します。

ああ、もちろん、ユーザーがEnterキーを押す限り、しばらくの間getkey()をループさせる必要があります。 raw_inputなどのメソッドを取得することもできます。このメソッドは、タブを押すとWord全体を記号ごとに取得するか、すべての可能性を表示します。

少なくともこれがアイテムです。最初から始めることができます。他の問題が発生した場合は、それらについて書いてください。

編集1:

Get_Wordメソッドは次のようになります。

def get_Word():
    s = ""
    while True:
        a = getkey()
        if a == "\n":
            break
        Elif a == "\t":
            print "all possibilities"
        else:
            s += a

    return s

Word = get_Word()
print Word

私が今発生している問題は、サインを表示する方法です。あなたは、入力とスペースなしで入力したばかりで、両方ともprint aおよびprint a,します。

6
Gandi

Pythonシェルでオートコンプリートを有効にするには、次のように入力します。

import rlcompleter, readline
readline.parse_and_bind('tab:complete')

(おかげで http://blog.e-Shell.org/221

4
Nicolas S

手順:

  1. 次のコマンドでホームディレクトリに.pythonrcファイルを作成します:vi .pythonrc

  2. このコンテンツを入力してください:

    import rlcompleter, readline  
    readline.parse_and_bind('tab:complete') 
    
  3. ファイルを閉じます

  4. 今すぐ実行

    echo "export PYTHONSTARTUP=~/.pythonrc" >> ~/.bashrc

  5. ターミナルを再起動します

2
AMAN JAIN

インタプリタでオートコンプリートを検索する(私のような)場合は、次のようになります。

https://web.archive.org/web/20140214003802/http://conjurecode.com/enable-auto-complete-in-python-interpreter/

これには、ファイルの作成.pythonrc、変更.bashrcimport sys Pythonインタープリターを起動するたびにインポートする必要があります。

後者はさらに勝つために自動化できるのだろうか。

1
Mark Jeronimus