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))'))
}
devmode2
1行に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))'))
}