Это не имеет, вероятно, ничего общего с robo
compspec. Также не выполняется функция завершения _scp
, связанная с scp
.
Возможно, это связано с вашим COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
.
Вы удалили :
из списка разделителей. Очевидно, _scp
достаточно прочен, чтобы вести себя с :
или без него в качестве разделителя слов. Он возвращает тот же список доработок кандидата. Но токен, который заменяется, когда _scp
возвращает только один кандидат для завершения, например. scp host:public_ht
, is 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
, потому что это полный host:public_ht
, что заменяется bazcux
.
Решение вашей проблемы, вероятно, заключается в том, чтобы адаптировать вашу функцию завершения _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
Намного (по-видимому) более простое решение состоит в замене функции _stem
выше существующей __reassemble_comp_words_by_ref
функции bash_completion
библиотеки:
_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' не знает о массивах, но вы их используете. –