7

私はPythonで(Mercurialの拡張として)小さなCLIを作成しており、タブ補完をサポートしたいと考えています。具体的には、プロンプトにタブをキャッチして、一致するオプションのリストを表示したいと思います(bashのように)。

例:セクション名を入力します:

 ext*TAB*  
 extensions  
 extras

問題は、Tabイベントをキャッチする方法がわからないことです。私はui.prompt()MercurialのAPIを使用しています。これは内部で呼び出しているだけraw_input()です。

私の知る限り、raw_input()「Enter」でのみ返され、ユーザーがタブに入ると、返される文字列には単に。が含まれます"\t"

4

3 に答える 3

17

そのためには、readlineモジュールを使用します。

私が考えることができる最も単純なコード:

import readline
COMMANDS = ['extra', 'extension', 'stuff', 'errors',
            'email', 'foobar', 'foo']

def complete(text, state):
    for cmd in COMMANDS:
        if cmd.startswith(text):
            if not state:
                return cmd
            else:
                state -= 1

readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input('Enter section name: ')

使用例:

Enter section name: <tab>
email      errors     extension  extra      foo        foobar    stuff
Enter section name: e<tab>
email      errors     extension  extra      
Enter section name: ext<tab>
extension  extra      

完了に加えて、readline以下を提供します。

  • ライン編集
  • キーバインディング構成(emacsおよびviモードを含む)
  • 履歴(前の値を呼び出すための上矢印)
  • 履歴の検索、保存、読み込み
于 2010-01-12T01:13:35.617 に答える
2

readlineと連携してタブ補完を行う方法の優れた例は、標準ライブラリでrlcompleterモジュールとして提供されています。そのままでは使用できません(Pythonのメインおよびビルトインで現在定義されている名前に基づいて補完されます)。しかし、それは一般的なタスクを実行する方法とそれをに接続する方法を示していますreadline

于 2010-01-12T01:22:01.497 に答える