シェル用の独自の補完を記述します。 パート2:bash


これらの記事(テーマ別に2つの部分に分ける方が良いと判断しました)は、独自のプログラム用のオートコンプリートファイルを作成するための基本事項の一部を説明しています。


前文

私のプロジェクトの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 ] 

フラグのリスト:


ファイル構造

ここでは、 すべての変数が配列を返す必要があります。 ここには特別な形式はありません。 最初にフラグを説明し、次に他のすべての変数を説明します。 _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/に任意の名前で保存されます。 サンプルファイルは完全に私のリポジトリにあります

Source: https://habr.com/ru/post/J230425/


All Articles