以下 bash 补全将一组可能的单词(即补全)传递给 compgen。
basenames=("foo" "fu bar" "baz");
COMPREPLY=($(compgen -W "${basenames[*]}" -- "${COMP_WORDS[COMP_CWORD]}"))
问题是数组元素中的空格没有被保留,也就是说,由于分词,“foo bar”被视为元素。有没有办法保留空白,以便显示 3 个元素,而不是 4 个?
编辑
basenames
包含文件名,即几乎每个字符(除了 / 和 \0)都是允许的。
编辑 2
-W 标志需要一个单词,例如foo bar foobar
. 将多个元素传递给它(这是${basenames[@]}
会做的)将不起作用。
编辑 3
更改了示例 basenames 数组(因此 thefoo
和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]}"))