這可能無關,與你的robo
compspec。與scp
關聯的_scp
完成功能也不是。
這可能是由於您的COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
。
您從分隔符列表中刪除了:
。顯然_scp
是足夠強大的行爲相同或不:
作爲一個字詞分隔符。它返回相同的候選完成列表。但是當_scp
只返回一個候選者以完成時,替換的令牌例如scp host:public_ht
,是host:public_ht
,而不是僅僅public_ht
。證明:
$ _foobar() { COMPREPLY=bazcux; return 0; }
$ complete -o default -F _foobar foobar
$ echo $COMP_WORDBREAKS
"'><=;|&(:
如果你試圖完成foobar host:public_ht
,你foobar host:bazcux
因爲取代令牌只是public_ht
。雖然有:
$ COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
$ echo $COMP_WORDBREAKS
"'><=;|&(
,如果你試圖完成foobar host:public_ht
,你foobar bazcux
,因爲它是由bazcux
取代了完整host:public_ht
。
解決您的問題的方法很可能是修改您的_robo
完成功能,以免它不要求:
不是字詞分隔符。喜歡的東西:
_stem() {
local lcur lprev
lcur="$cur"
stem="$lcur"
for ((i = cword - 1; i >= 0; i -= 1)); do
lprev="${words[i]}"
[[ $lcur == ":" ]] && [[ $lprev == ":" ]] && break
[[ $lcur != ":" ]] && [[ $lprev != ":" ]] && break
stem="$lprev$stem"
lcur="$lprev"
done
}
_robo() {
local cur prev words cword
_init_completion || return
local stem options
options=($(__robo_list_opts) $(__robo_list_cmds))
COMPREPLY=()
_stem
COMPREPLY=($(compgen -W '${options[@]}' -- "$stem"))
[[ $stem =~ : ]] && stem=${stem%:*}: && COMPREPLY=(${COMPREPLY[@]#"$stem"})
return 0
}
complete -o default -F _robo robo
一個多(顯然)簡單的解決方案在於通過bash_completion
庫的現有__reassemble_comp_words_by_ref
函數替換上面的_stem
功能:
_robo() {
local cur prev words cword
_init_completion || return
__reassemble_comp_words_by_ref ":" words cword
options=($(__robo_list_opts) $(__robo_list_cmds))
COMPREPLY=($(compgen -W '${options[@]}' -- "$cur"))
return 0
}
complete -o default -F _robo robo
所有這可能不是你想要什麼。我不知道robo.il
,並且可能有許多改進將考慮更多的上下文來提出具體的完成。但這可能是一個起點。
這不會解決你的問題,但是注意:完成腳本是* sourced *(通常在'〜/ .bashrc'或'/ etc/bash.bashrc'中),所以shebang行是不重要的。如果*不被忽略,事情就會中斷,因爲'sh'不知道數組,但是你使用它們。 –