bashでcompgenを使用して大文字と小文字を区別せずに完成する

bashでcompgenを使用して大文字と小文字を区別せずに完成する

bash(devmode2)を使用してコマンドを自動補完しようとしています。複合Gene-W、私のbashrcには次のものがあります。

_devmode2() {
    COMPREPLY=()
    local sonames=$(devmode2 --auto --current "${COMP_CWORD}" -- ${COMP_WORDS[@]})
    COMPREPLY=($(compgen -W "${sonames}" -- ${COMP_WORDS[COMP_CWORD]}))
}
complete -F _devmode2 devmode2

オートコンプリートの例

$ devmode2 g<tab>

明らかにするソネーム次の値を使用します。

game-life-adv
game-life-sparse
getopt-alt
git-workflow
git-workflow-extra
github-testers
group-git
group-git-ivan
Group-Git-Taggers-Maven
Group-Git-Taggers-Node
Group-Git-Taggers-Perl
Group-Git-Taggers-Ruby

しかし、私のオートコンプリートでは、次の提案が生成されます。

game-life-adv       game-life-sparse    getopt-alt          github-testers      git-workflow        git-workflow-extra  group-git           group-git-ivan

私が渡したすべての値をどのように取得できますか?キャンプゲン退く?

答え1

私が知る限り、compgen提供するオプションのリストから大文字と小文字を区別せずにフィルタリングするオプションはありません。

readlineファイル名の補完で大文字と小文字を区別しないように変数を設定できます。

bind "set completion-ignore-case on"

ただし、これは動作に影響を与えず、compgenプログラム可能な完成機能では動作しない可能性があります。 (ファイル名でも少し奇妙に動作します。)

compgenこれを使用する代わりに(またはフィルタリング以外の機能が必要な場合と一緒に使用して)独自のフィルタリングを実行できますcompgen。これはあなたの例には当てはまりません。

単に代替リストを繰り返し、大文字と小文字を区別しないプレフィックス比較を実行することでこれを実行できますが、次のような小さな関数が機能します。

_devmode2() {
  local sonames=($(devmode2 --auto --current "${COMP_CWORD}" -- ${COMP_WORDS[@]}))
  local prefix="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=($(printf %s\\n "${sonames[@]}" |
               awk -v IGNORECASE=1 -v p="$prefix" \
                   'p==substr($0,0,length(p))'))
}

devmode21行に1つの代替項目を出力すると、入力として使用する方が簡単になりますawk。また、私が知っている限り、完成関数の2番目のパラメータは常に${COMP_WORDS[COMP_CWORD]}。したがって、これはより簡単かもしれません。

_devmode2() {
  COMPREPLY=($(devmode2 -auto --current "${COMP_CWORD}" -- "${COMP_WORDS[@]}" \
               awk -v IGNORECASE=1 -v p="$2" \
                   'p==substr($0,0,length(p))'))
}

関連情報