不明なコマンド名のBash完了(公開プレフィックスを含む)

不明なコマンド名のBash完了(公開プレフィックスを含む)

現在の状況は、バイナリがすべて同じプレフィックスで始まる一連のアプリケーションに対してbash完成を設定する必要があることです。これを呼び出してみましょうblargh。私はこの完成機を使用している人が自分のコンピュータにどのアプリケーションを持っているのかわからず、おそらく知りませんblargh*(私の場合、プレフィックスは他のコマンドの正常な動作を妨げないほどユニークですが)。

つまり、次のようなことをしたいのです。

complete -F _function_name "blargh*" "./blargh*"

今私が得ることは非常に一般的な完了プログラムです。

# blargh-completions.bash

_blargh_completions () {
    COMPREPLY=...
}

_blargh_init_completions () {
    local blargh
    for blargh in blarghABC blarghXYZ blargh123 blarghXXX-debug blarghARGH ; do
        complete -F _blargh_completions "$blargh"
        complete -F _blargh_completions "./$blargh"
    done
}

_blargh_init_completions

最初はアプリケーション名を推測できましたが、まだスクリプトを再確認し、必要に応じてforループ内のローカルコピーを更新するように指示する必要がありますが、これは理想的ではありません。

そして私がどこに行くのか少し不明です。インストールする複数のプログラムの完了スクリプトを処理します。すべてのオプション欠点があります:

  • 私が入れることができます互換性カタログ(例/etc/bash_completion.d/):これにより、スクリプトは複数のコマンドを使用できますが、同時にすべての文書でこの場所は使用されなくなり、使用しないでください。
  • 私が入れることができます全目次(例/usr/share/bash-completion/completions/:):ただし、スクリプトはこのディレクトリのコマンドと同じ名前を持つ必要があるため、この場合どのように機能させるのかわかりません。
  • ~/.bash_completion自動更新/削除が困難にならない限り、ユーザーファイルに追加できます。

だから私の質問は次のようになります可能であれば、blargh*正確なコマンド名を事前に知らずにワイルドカード名パターンとして機能する完成スクリプトをどのように作成してインストールできますか?

答え1

残念ながら、このcompleteコマンドはコマンド名のワイルドカード/プレフィックスをサポートしません。

blarghただし、サフィックス(私の意見ではサブコマンド名)を使用するラッパー関数を導入し、それにbash完了関数を生成できます。


blargh() {
    command "blargh$@"
}

_blargh_completion() {
    ((COMP_CWORD >= 1)) || return
    local subcommand="${COMP_WORDS[1]}"
    if ((COMP_CWORD == 1)); then
        # ${subcommand} is a prefix
        # emit subcommand names that start with it
    else
        # complete arguments for the ${subcommand}
    fi
}

complete -F _blargh_completion blargh

このメソッドblarghcreate ...も呼び出すことができblargh create ...、後者の呼び出しメソッドは自動的に完了することができます。その後、/usr/share/bash-completion/completions/blargh技術的にはコマンドの完成なので入れることができますblargh。 :-)

関連情報