向用户展示仅包含COMPREPLY bash完成选项的子字符串

6
在一个bash补全脚本中,假设COMPREPLY=(aa/ba/ aa/bb/)。当脚本被调用时,补全选项对用户来说看起来像这样:
$ foo aa/b<TAB>
aa/ba/
aa/bb/

然而,我希望能更好地控制这些选项的显示方式。特别是,我想要向用户显示每个COMPREPLY选项的子字符串,类似于bash中目录补全的工作方式:

$ foo aa/b<TAB>
ba/
bb/

有什么方法可以在bash中完成这个任务吗?
2个回答

6
我遇到了同样的问题,我通过调整将完成函数绑定到命令的方式来解决它。我知道在处理文件系统中的实际文件时这是有效的,我认为对于任何类型的文件路径(如选项),它也可以奏效,但我不确定。
之前:
complete -F _fubar fubar

之后:
complete -o filenames -F _fubar fubar

更多细节请参考:可编程完成内置命令

太棒了!现在我只需要想办法在我的函数中有选择性地打开/关闭不同COMPREPLY情况的选项,而不使用 compopt - Roman Nurik

2

这段代码取自Debian Sid /etc/bash_completion,应该能起到帮助作用:

# Remove colon-word prefix from COMPREPLY items
local colon_word=${1%${1##*:}}
local i=${#COMPREPLY[*]}
while [ $((--i)) -ge 0 ]; do
    COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
done

谢谢enzotib。不幸的是,这种技术不起作用,因为子字符串会替换整个完成。也就是说,foo aa/b<TAB> 变成了 foo ba/ :-( - Roman Nurik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接