チュートリアル:プログラム可能なタブ補完¶
概要¶
他の多くのシェルと同様に、xonshは "tab"キーを押すと部分的に指定された引数を完成させることができます。
Pythonモードでは、 "tab"キーを押すと、現在の組み込み関数、グローバル変数、ローカル変数、xonsh言語のキーワードと演算子、ファイルとディレクトリ、環境変数名の変数名に基づいて完了します。サブプロセスモードでは、$ PATH上の実行可能ファイルの名前、エイリアスキー、およびコマンド自体の完全なBash補完に基づいて、xonshがさらに完了します。
xonshはまた、タブ補完の結果をカスタマイズすることができるメカニズムを提供します(つまり、新しい補完を生成するか、組み込み補完のサブセットを無視することができます)。
このページは、xonshの補完システムの内部構造を詳述し、新しいタブ補完機能を実装するための指示を含んでいます。
構造¶
xonshの組み込みコンプリータはxonsh.completers
パッケージに含まれており、ユニークな識別子を補完関数にマップするインスタンスOrderedDict
(__xonsh__.completers
)が管理されています。
"tab"キーが押されると、xonshは補完関数を順番にループし、それぞれの関数を順番に呼び出して、現在の行に対して空ではないセットを返す関数に到達するまで呼び出します。このセットはユーザに表示されます。
アクティブなコンプレッサーのリスト¶
コマンドを実行すると、アクティブなコンプリータのリストを表示できます
。このコマンドは、現在アクティブなコンプリータの名前と説明を、チェックされる順序で表示します。completer list
新しいCompleterの作成¶
Completersは5つの引数をとるPython関数として実装されています:
prefix
:マッチする文字列(現在の行の最後の空白で区切られたトークン)line
:現在の行全体を表す文字列begidx
:インデックスのprefix
開始位置line
endidx
:prefix
終わるインデックスline
ctx
:名前に値をマッピングする辞書としての現在のPython環境
この関数はprefix
、現在のコンテキストで可能な補完のPythonセットを返さなければなりません。この場合、None
コンプリータを使用しない場合は、それが返されるか空のセットが返されます。これにより、xonshが動いて次のコンプリータを使用しようとします。
場合によっては、コンプリータは実際には始まらないマッチを返す必要がありprefix
ます。この場合には、コンプリータは、代わりにタプルを返す必要があり
、適切な補完の集合であり、内の文字の数である
ことが完了の一部として扱われるべきです。(completions, prefixlength)
completions
prefixlength
line
コンプリータのドキュメントストリングには、その機能の簡単な説明が含まれている必要があります。completer list
3つの例が続く。より多くの例については、実際にxonsh.completers
モジュールで使用されている補完者のソースコードを参照してください。
def dummy_completer(prefix, line, begidx, endidx, ctx):
'''
Completes everything with options "lou" and "carcolh",
regardless of the value of prefix.
'''
return {"lou", "carcolh"}
def python_context_completer(prefix, line, begidx, endidx, ctx):
'''
Completes based on the names in the current Python environment
'''
return {i for i in ctx if i.startswith(prefix)}
def unbeliever_completer(prefix, line, begidx, endidx, ctx):
'''
Replaces "lou carcolh" with "snail" if tab is pressed after typing
"lou" and when typing "carcolh"
'''
if 'carcolh'.startswith(prefix) and line[:begidx].split()[-1] == 'lou':
return ({'snail'}, len('lou ') + len(prefix))
コンプリータの登録¶
補完関数を作成したら、次のコマンドを使用して補完関数のリストに追加することができます。completer add
Usage:
completer add NAME FUNC [POS]
NAME
リストに使用する一意の名前です
FUNC
使用するコンプリータ関数の名前です。
POS
(オプション)は、新しいコンプリータを追加するコンプリータのリストの位置です。次の値のいずれかになります。
"start"
コンプリータは、コンプリータのリストの先頭に追加する必要があることを示します(他のものの前に実行する必要があります)"end"
コンプリータのリストの最後にコンプリータを追加する必要があることを示します(他のコンビネーションの後に実行する必要があります)">KEY"
、KEY
既存の名前はどこにありますか?これは、コンプリータ名の後に追加する必要があることを示しますKEY
"<KEY"
、KEY
既存の名前はどこにありますか?これは、コンプリータが名前の前に追加されるべきであることを示しますKEY
if POS
が指定されていない場合、デフォルトはfalse "start"
です。
注意
__xonsh__.completers
直接操作することも可能ですが、これが望ましい方法です。
Completerの削除¶
補完者をアクティブ補完者のリストから削除するには、を実行
します。は削除する補完者に関連付けられた一意の識別子です。completer remove NAME
NAME