Python コマンドラインインターフェイスのタブ補完 - タブイベントをキャッチする方法
-
20-09-2019 - |
質問
私は 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のモジュールを使用すると、何をしようとしての、おそらく他の部分。車輪の再発明ない点はありません。
所属していません StackOverflow