bash - Bash 中的远程 URL 补全

标签 bash shell svn bash-completion

我目前正在为 Bash 中的 svn 添加远程 url 补全支持。我目前正在使用修改后的 bash-completion-svn,它可以确定何时触发 URls 上的完成,看起来像

  svn+ssh://$HOST/$DIR/prefix_string

我设法提取了 URL 的父目录部分 (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 才能做到这一点吗?

最佳答案

对于我的 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

关于bash - Bash 中的远程 URL 补全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19244236/

相关文章:

bash - 将 nettop 的输出保存到文件 ( mac )

svn - Xcode 10 不支持 SVN (Subversion)

bash - 在 osx 上使用 xld 在命令行中分割提示音频文件

regex - 将文件夹中的所有图像移动到子文件夹,并将文本文件中对这些图像的所有引用更新到它们的新位置?

python - 需要编写python脚本在cygwin中执行linux命令

shell - for 循环的 POSIX sh 语法 [SC2039]

svn - 版本号名称规范的常用或类别是什么?

linux - 在 Linux 中将 SVN 存储库目录放在哪里?

bash - 查找少于 2000 行的文本文件并删除它们

linux - 如何将一个文本文件拆分为多个 *.txt 文件?