Python コマンドラインインターフェイスのタブ補完 - タブイベントをキャッチする方法

StackOverflow https://stackoverflow.com/questions/2046050

質問

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

例:セクション名を入力してください:

 ext*TAB*  
 extensions  
 extras

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

私の知る限りでは、 raw_input() 「enter」の場合にのみ返され、ユーザーがタブを入力した場合、返される文字列には単純に "\t".

役に立ちましたか?

解決

そのためには、 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 モードを含む)
  • 履歴 (以前の値を呼び出すには上矢印)
  • 履歴の検索、保存、読み込み

他のヒント

readlineの<と協力して、タブ補完を行う方法の優れた例/> rlcompleter のモジュールとして標準ライブラリで提供されている - あなたはできません(それが現在はPythonのメインと組み込みで定義された名前に基づいて完了)されたとして、それを使用するが、それは一般的なタスクを行う方法とreadlineするためにそれをフックする方法を示しています。

あなたはほぼ確実に使用する必要があります CMDモジュールに、すでにタブ補完を実装しますように、そしてあなたがそうでreadlineのモジュールを使用すると、何をしようとしての、おそらく他の部分。車輪の再発明ない点はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top