我无法弄清楚我做错了什么。我有我的bash_completion文件设置:
_bcd()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "$(back_directory.pl --complete $cur)" -- $cur) )
}
complete -o filenames -o nospace -F _bcd bcd
back_directory.pl是一个程序,它将返回树上的目录路径:back_directory.pl --complete Th
生成:This\ test/
但是:
22:50:24-Josh@Joshuas-MacBook-Air:~/Desktop/bcd/This test/more white/t$ bcd Th<TAB><TAB>
This test/
如上所示,对于包含空格的目录,它不会自动完成(但它显示了完成选项)。
它应如下所示:bcd This\ test/
我认为-o filenames
应该添加反斜杠以逃避空白。感谢您的帮助:))
答案 0 :(得分:1)
您对compgen
的单个来电会产生一个单词(包含嵌入的换行符),因此您只需向COMPREPLY
添加一个可能的完成时间。相反,您需要一次处理back_directory.pl
一项的输出。每个项目都会作为可能的匹配进行测试,如果compgen
返回非空字符串,请将其添加到COMPREPLY
。
_bcd() {
local cur=${COMP_WORDS[COMP_CWORD]}
IFS=: read -a matches < <(back_directory.pl --complete "$cur")
for match in "${matches[@]}"; do
possible=$(IFS= compgen -W "$match" -- "$cur")
[[ $possible ] && COMPREPLY+=( "$possible" )
done
}
(注意:我假设back_directory.pl
将产生一行类似于
directory1:directory two:directory three:directory4
)
答案 1 :(得分:0)
为了完成,这是最终文件:
_bcd()
{
local cur=${COMP_WORDS[COMP_CWORD]}
IFS=: read -a matches < <(back_directory.pl --complete "$cur")
for match in "${matches[@]}"; do
possible=$(IFS= compgen -W "$match" -- "${cur#/}")
[[ $possible ]] && COMPREPLY+=( "$possible" )
done
longest=""
for e in "${COMPREPLY[@]}"; do
if [[ "$longest" == "" ]]; then
longest="$e"
fi
while [[ ! "$e" =~ ^$longest ]]; do
longest=${longest%?}
done
done
if [[ $longest != "$input" && "$cur" =~ ^/ ]]; then
for ((i=0; i<${#COMPREPLY[@]}; i++))
do
COMPREPLY[$i]="/${COMPREPLY[$i]}"
done
fi
}
complete -o filenames -o nospace -F _bcd bcd
脚本back_directory.pl --complete
将返回由冒号分隔的单行路径。
我的解决方案看起来非常糟糕,但确实有效。
基本上它从当前单词中删除一个开始斜杠,创建所有匹配(不包含起始斜杠),然后检查$longest
是否与$input
不同,这意味着bash会改变你当前的单词是不同的东西 - 在这种情况下,我们添加一个开始斜杠。