これらの記事(テーマ別に2つの部分に分ける方が良いと判断しました)は、独自のプログラム用のオートコンプリートファイルを作成するための基本事項の一部を説明しています。
- パート1:zsh
- パート2:bash
前文
私のプロジェクトの1つを開発する過程で、オートコンプリートファイルも追加したいという要望がありました(理由は聞かないでください)。 幸いなことに、私はどういうわけかすでにそのようなことを書くことを引き受けましたが、それから私は何も読むのが面倒で、それをマスターしませんでした。
はじめに
Bashは、zshとは異なり、オートコンプリートに関して何らかの自転車製造を必要とします。 流ogにグーグルで、システムで利用可能な
pacman
のオートコンプリートファイルであるため、多少の通常のチュートリアルは見つかりませんでした(Archの創設者が多くの自転車を思い付かなかったことを心から願っています)。
同じmyアプリケーションの例を見てみましょう。 ヘルプの一部は次のようになります。
proga [ -h | --help ] [ -e ESSID | --essid ESSID ] [ - FILE | --config FILE ] [ -o PROFILE | --open PROFILE ] [ -t NUM | --tab NUM ] [ --set-opts OPTIONS ]
フラグのリスト:
-
-h
および--help
フラグは引数を必要としません。 -
-e
および--essid
は、自動補完なしの文字列としての引数が必要です。 -
-c
および--config
フラグには、文字列としての引数、任意の場所のファイルが必要です。 -
-o
および--open
は、文字列としての引数、特定のディレクトリからのファイルのオートコンプリートが必要です。 -
-t
および--tab
は、文字列としての引数、指定された配列からの自動補完が必要です。 -
--set-opts
は文字列としての引数が必要で、コンマで区切られた指定された配列からのオートコンプリート。
ファイル構造
ここでは、 すべての変数が配列を返す必要があります。 ここには特別な形式はありません。 最初にフラグを説明し、次に他のすべての変数を説明します。
_proga_profiles()
は、他の変数とは異なり、現在の配列を返す必要があることを思い出します(以下では関数の詳細を説明しません
_proga_profiles()
。
# variables _proga_arglist=() _proga_settings=() _proga_tabs=() _proga_profiles() {}
次に、特定のチームの自動補完のために呼び出される主な機能があります。 私の場合、コマンドは1つで、関数は1つです。
# work block _proga() {}
さらに、 別の関数に割り当てずに、 「関数コマンド」という対応を作成します。
complete -F _proga proga
旗
前述のように、ここには特別な形式はありません。使用可能なフラグは単純に配列内にあります。
_proga_arglist=( '-h' '--help' '-e' '--essid' '-c' '--config' '-o' '--open' '-t' '--tab' '--set-opts' )
変数の配列
zshでは、次のような関数のみを提供します。
_proga_profiles() { print $(find /some/path -maxdepth 1 -type f -printf "%f\n") }
bashでは、これはうまくいきません。少し変更する必要がありました。
_proga_profiles() { echo $(find /some/path -maxdepth 1 -type f -printf "%f\n") }
関数本体
bashでのオートコンプリートでは、
COMPREPLY
変数が
COMPREPLY
ます。 現在の状態を追跡するには、パラメーター
cur
(現在のオプション)および
prev
(前の状態自体)を
prev
して
_get_comp_words_by_ref
関数を呼び出す必要があります。 ケースの特定の部分に折りたたむには、いくつかのポイントが必要です(変数に
want*
)。
compgen
自動補完を生成するために使用されます。
-W
フラグの後に、単語のリストが表示されます。 (関数を呼び出す
-F
フラグもありますが、私にとってはVorningも生成します。)最後の引数は、オートコンプリートが生成される現在の行です。
したがって、関数は次のようになります。
_proga() { COMPREPLY=() wantfiles='-@(c|-config)' wantprofiles='-@(o|-open|s|-select)' wantsettings='-@(-set-opts)' wanttabs='-@(t|-tab)' _get_comp_words_by_ref cur prev if [[ $prev = $wantstring ]]; then # , COMPREPLY=() elif [[ $prev = $wantfiles ]]; then # _filedir elif [[ $prev = $wantprofiles ]]; then # COMPREPLY=($(compgen -W '${_proga_profiles[@]}' -- "$cur")) elif [[ $prev = $wanttabs ]]; then # COMPREPLY=($(compgen -W '${_proga_tabs[@]}' -- "$cur")) elif [[ $prev = $wantsettings ]]; then # # -S , =( COMPREPLY=($(compgen -S ',' -W '${_proga_settings[@]}' -- "$cur")) else # COMPREPLY=($(compgen -W '${_proga_arglist[@]}' -- "$cur")) fi true }
おわりに
ファイルは、ディレクトリ
/usr/share/bash-completion/completions/
に任意の名前で保存されます。 サンプルファイルは完全に私のリポジトリにあります 。