【发布时间】:2015-02-12 13:52:41
【问题描述】:
我正在为一个实用程序编写一个 bash 选项卡完成文件,该实用程序有时需要表单上的完整 URL:protocol://host:port。这包含两个冒号,这已被证明对于制表符完成存在问题。这是因为冒号被视为分词。我读过我不应该直接更改COMP_WORDBREAKS,所以我想按照这里的建议使用_get_comp_words_by_ref 和__ltrim_colon_completions:How to reset COMP_WORDBREAKS without effecting other completion script?
这适用于单个冒号,但第二个冒号会导致一个小问题,如以下最小示例所示:
这个例子说明了这个问题。它出现在建议中的任意数量的冒号上。
[root@2e3e8853cc0c /]# cat /etc/bash_completion.d/foo
_foo()
{
local cur
COMPREPLY=()
_get_comp_words_by_ref -n : -c cur
COMPREPLY=( $(compgen -W "http://host:1234/aaa http://host:1234/bbb http://host:1234/ccc" -- ${cur}) )
__ltrim_colon_completions "$cur"
return 0
}
complete -F _foo foo
foo 成功完成公共部分后点击标签。之后点击两次选项卡,会产生以下建议:
[root@2e3e8853cc0c /]# foo http://host:1234/
1234/aaa 1234/bbb 1234/ccc
想要的结果当然是:
[root@2e3e8853cc0c /]# foo http://host:1234/
http://host:1234/aaa http://host:1234/bbb http://host:1234/ccc
之后,点击 a、b 或 c 加标签按预期工作,它完成了完整的 URL。
关于如何产生正确的输出有什么建议吗?是否需要手动更改COMPREPLY 变量,还是我只是使用了错误的函数?
【问题讨论】:
-
我已经从
COMP_WORDBREAKS中删除了@、:和=,我可以不用它们。 :) -
我也可以不用它们,但是这个实用程序将安装在多个主机上,而不仅仅是我的。使用 scp 时,远程主机和文件路径之间有一个冒号是正常的,如果我删除冒号,这将表现不同。
-
每当我想要在
:(或=)之后自动完成文件名时,我只需在:之后输入SPACE。文件名完成后,我会将光标移回并删除SPACE。我正在使用 Bash 的vi编辑模式,所以这几乎不会增加任何成本。 -
当您修改自己的环境时这没问题,但我不想在我的包中添加这样的 hack。我需要一种在不改变系统中其他工具的自动完成行为的情况下解决我的问题的方法。
标签: bash bash-completion