次の bash 補完は、可能な単語 (補完) の配列を compgen に渡します。
basenames=("foo" "fu bar" "baz");
COMPREPLY=($(compgen -W "${basenames[*]}" -- "${COMP_WORDS[COMP_CWORD]}"))
問題は、配列要素の空白が保持されないことです。つまり、「foo bar」は単語分割のおかげで要素として扱われます。4 要素ではなく 3 要素が表示されるように、空白を保持する方法はありますか?
編集
basenames
ファイル名が含まれているため、ほぼすべての文字 (/ と \0 を除く) を使用できます。
編集2
-W フラグは、 のような単一の単語を想定していfoo bar foobar
ます。それに複数の要素を渡す (これは何${basenames[@]}
をするか) は機能しません。
編集3
例の basenames 配列を変更しました (そのため、foo
とfoo
fromfoo bar
は折りたたまれません)。
改行を使用して単語を区切ることができます。
local IFS=$'\n'
COMPREPLY=($(compgen -W "$(printf "%s\n" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))
を使用しても、次の\0
ことはできません。
local IFS=$'\0'
COMPREPLY=($(compgen -W "$(printf "%s\0" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))