7

Python は、その readline バインディングを介して、優れたコマンドライン オートコンプリートを可能にします (ここで説明されているように)。

しかし、補完は文字列の先頭でしか機能しないようです。文字列の途中または最後に一致させたい場合、readline は機能しません。

コマンドライン python プログラムで、使用可能な文字列のリスト内の文字列のいずれかと入力内容を照合することにより、文字列をオートコンプリートしたいと考えています。

  • 私が望んでいるオートコンプリートのタイプの良い例は、To フィールドに入力したときに GMail で発生するタイプです。連絡先の姓の 1 つを入力すると、名前を入力した場合と同じように表示されます。
  • 上矢印と下矢印を使用するか、一致した文字列から選択する他の方法が必要になる場合があり (readline の場合は必要ありません)、私の場合は問題ありません。
  • 私の特定の使用例は、メールを送信するコマンドライン プログラムです。
  • 具体的なコード例は非常に役立ちます。

curses のような端末エミュレーターを使用しても問題ありません。Mac や Windows ではなく、Linux でのみ実行する必要があります。

以下に例を示します。リストに次の 3 つの文字列があるとします。

['Paul Eden <paul@domain.com>', 
'Eden Jones <ejones@domain.com>', 
'Somebody Else <somebody@domain.com>']

「Eden」と入力した後、リストの最初の 2 つの項目をオートコンプリートし、そのうちの 1 つを選択できるようにするコードが必要です (すべてキーボードを使用したコマンドラインから)。

4

1 に答える 1

10

問題を理解しているかどうかわかりません。readline.clear_history と readline.add_history を使用して必要な補完可能な文字列を設定し、次に control-r を使用して履歴のバックワードを検索できます (シェル プロンプトにいるかのように)。例えば:

#!/usr/bin/env python

import readline

readline.clear_history()
readline.add_history('foo')
readline.add_history('bar')

while 1:
    print raw_input('> ')

または、独自の完全版を作成し、適切なキーをバインドすることもできます。このバージョンでは、マッチ リストが膨大な場合に備えてキャッシュを使用します。

#!/usr/bin/env python

import readline

values = ['Paul Eden <paul@domain.com>', 
          'Eden Jones <ejones@domain.com>', 
          'Somebody Else <somebody@domain.com>']
completions = {}

def completer(text, state):
    try:
        matches = completions[text]
    except KeyError:
        matches = [value for value in values
                   if text.upper() in value.upper()]
        completions[text] = matches
    try:
        return matches[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind('tab: menu-complete')

while 1:
    a = raw_input('> ')
    print 'said:', a
于 2008-10-16T17:23:34.677 に答える