complete
当选项中${COMPREPLY[@]}
包含字符时,我无法提供完整的建议:
。相反,它只提供所有建议共有的前缀。
这是一个运行良好的例子:
_foo()
{
local cur=${COMP_WORDS[$COMP_CWORD]}
COMPREPLY=( $(compgen -W "bart baze" -- "$cur" ) )
}
complete -F _foo foo
以下是它的使用方法(我从不按Enter,只TAB在指示的地方按)
$ foo <tab>
$ foo ba <-- Autocompletes common prefix, good
$ foo ba<tab>
bart baze <-- Suggests options, good
$ foo bar<tab>
$ foo bart <-- Autocompletes the only option, good
但是,如果我在前面添加一些内容:
,例如http://
,它就无法提供完整的建议(仅提供所有选项共有的前缀):
$ _foo()
{
local cur=${COMP_WORDS[$COMP_CWORD]}
COMPREPLY=( $(compgen -W "h:bart h:baze" -- "$cur" ) )
}
$ complete -F _foo foo
$ foo <tab>
$ foo h:ba <-- Autocompletes common prefix, good
$ foo h:ba<tab>
$ foo h:ba <-- No effect
该手册对-I
使用分隔符提出了一些建议,但complete -I -F _foo foo
并没有改变任何内容。
如果我深入检查,它似乎与如何complete -F
解释有关${COMPREPLY[@]}
。 compgen
似乎设置得COMPREPLY
很好。
$ COMPREPLY=( $(compgen -W "h:bart h:baze" -- h) )
$ for i in "${COMPREPLY[@]}"; do echo "$i"; done
h:bart
h:baze
@meuh 的评论让我找到了https://stackoverflow.com/questions/10528695/how-to-reset-comp-wordbreaks-without-affecting-other-completion-script,并从中找到了答案。
Bash 提供了许多宏来帮助
/etc/bash_completion
。在 Debian 中,这些宏来源于/usr/share/bash-completion/bash_completion
。浏览此文件,有一些处理冒号的方法:
_init_completion -n :
:
将从中删除$COMP_WORDBREAKS
。但仅调用此方法还不够,否则你会发现^.*:
自动完成结果中重复出现__ltrim_colon_completions
^.*:
将从完成中删除前导,这稍微修复了之前的问题。结果是:
这些建议有点奇怪,特别是当你期待
http://example.com
并得到时//example.com
,但它确实有效。但是文档
__ltrim_colon_completions()
说:我不太喜欢强加
/etc/bash.bashrc
,尤其是因为这个完成脚本将部署在包中,而且我不会进行本地编辑。此更改还可能改变其他完成脚本的行为,这些脚本实际上依赖分隔:
符来解析 之类的内容$PATH
。我最终找到的解决方案是在我的
/usr/share/bash-completion/completions/foo
脚本中进行以下设置:很难说这是否会产生全局影响。新 shell 没有定义
$COMP_WORDBREAKS
,但我不确定是否bash-completion
在完成之间重置它。