私はCLIユーティリティを書いています。環境セット、使用法は次のとおりですenvset [ENVSET-OPTIONS] [SETNAME] [--] [CMD] [ARGS]...
。
デフォルトでは、構成ファイルで定義されている一連の環境変数を使用してコマンドを実行します(すでにnpmパッケージ名前は同じですが、異なる機能セットを使用してPerlにユーティリティを実装しています。
のタブ完成機能を提供したいと思いますenvset
。完了はシェル関数によって処理されます_envset
。次のような場合は良いようです(^
押したときにカーソルの位置を表示します)Tab
。
% envset mycolors -- ls -^
_envset
完全な答えls
(および可能なlsコマンドラインオプションのリスト)を返すことができます。 bashに私に返す簡単な方法はありますか?
それ以外の場合は、次のことを行う必要があります_envset
(完璧ではありませんが、ほとんどの場合十分です)。
出力を解析し
complete
て、コマンド(上記の例でls
)がどのように完了するかを説明する項目を見つけます。それ以外の場合は-D
(デフォルトハンドラ)を使って項目を見つけます。関数(-F)によってコマンドが完了すると、この関数が呼び出されます(COMP_WORDSとCOMP_CWORDが適切に設定された後)。関数から COMPREPLY を返します。
外部コマンド(-C)によってコマンドが完了したら、コマンドを実行します(COMP_LINEとCOMP_POINTを適切に設定した後)。出力ラインをキャプチャして COMPREPLY を設定します。
他のタイプのハンドラ(-W、-Gなど)についても同様です。 -F、-C、-W、-A を処理すれば、ほとんどの場合に対処できると思います。
124を返すデフォルトのハンドラには特別な場合があります。つまり、
complete
必要なコマンドに対してハンドラがすでに定義されていることを確認するには、手順1から再開する必要があります。