我目前正在为Bash中的svn添加对远程网址完成的支持。我目前正在使用修改后的bash-completion-svn来确定何时在URls上触发完成,看起来像
svn+ssh://$HOST/$DIR/prefix_string
我设法提取了网址(svn+ssh://$HOST/$DIR
)的父级目录部分并在其中调用了svn ls
并
cur_suffix=prefix_string
现在剩下的就是如何使用URL的目录部分以及用户输入的prefix_string
(可以为空)来完成。我可以使用compgen
来完成这项工作吗?
如果url中的最后一个字符是斜杠,或者如果后缀为空,则获取可能的完成列表。
目前我正在使用
fix=( $(compgen -o nospace -W "$remote_fileds" -- $cur_suffix))
为URL等完成
svn://HOST/DIR/a
完成前例
svn://HIST/DIR/a_file
然而,无论如何总是选择第一个替代方案,并且总是在我写-o nospace
时插入空格。如果存在其他可能的匹配(前缀a
不唯一),如何防止完成compgen完成,如何在不移动光标的情况下将这些匹配打印在光标下方。只能complete
这样做吗?
答案 0 :(得分:1)
对于我的bash完成脚本,它必须在各种版本的bash上运行,并且具有不同级别的完成支持,我使用以下成语来尝试最好的“完整”可能,然后优雅地回退到至少某些东西应该管用;例如,假设命令svn2
,以及称为_complete_svn2
的完成函数:
complete -o bashdefault -o default -o nospace -F _complete_svn2 svn2 2>/dev/null \
|| complete -o default -o nospace -F _complete_svn2 svn2 2>/dev/null \
|| complete -o default -F _complete_svn2 svn2 2>/dev/null \
|| complete -F _complete_svn2 svn2
理想情况下,“-o nospace
”存在且有效,但如果不存在,则可以回退到“-o default
”。
此外,上面的示例使用函数生成完成,任意称为_complete_svn2
。也许你也可以尝试使用类似的东西。以下示例适用于我,显示匹配选项,不添加额外空间等(它故意不完成“ - ”选项):
_complete_svn2() {
local options="one two three four five"
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=()
[[ ${cur} != -* ]] && COMPREPLY=( $(compgen -W "${options}" -- ${cur}) )
}
,例如,(“五”后没有添加空格)
$ svn2 f[tab]
five four
$ svn2 fi[tab]
$ svn2 five