チュートリアル:プログラム可能なタブ補完

概要

他の多くのシェルと同様に、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
  • endidxprefix終わるインデックスline
  • ctx:名前に値をマッピングする辞書としての現在のPython環境

この関数はprefix 、現在のコンテキストで可能な補完のPythonセットを返さなければなりませんこの場合、Noneコンプリータを使用しない場合は、それが返されるか空のセットが返されます。これにより、xonshが動いて次のコンプリータを使用しようとします。

場合によっては、コンプリータは実際には始まらないマッチを返す必要がありprefixます。この場合には、コンプリータは、代わりにタプルを返す必要があり 適切な補完の集合であり、内の文字の数である ことが完了の一部として扱われるべきです。(completions, prefixlength)completionsprefixlengthline

コンプリータのドキュメントストリングには、その機能の簡単な説明が含まれている必要があります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 NAMENAME