我目前正在为 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/