Bash中的远程URL完成

时间:2013-10-08 09:42:13

标签: bash shell svn bash-completion

我目前正在为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这样做吗?

1 个答案:

答案 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