これはおそらく、あなたのrobo
補完仕様とは何の関係もありません。完了関数はscp
に関連付けられていません。
おそらくあなたのCOMP_WORDBREAKS=${COMP_WORDBREAKS//:}
が原因です。
セパレータのリストから:
を削除しました。明らかに_scp
は、ワードセパレータとして:
の有無にかかわらず同じように動作するように頑強です。候補補完の同じリストを返します。しかし、_scp
が完了のためのただ1つの候補を返すときに置換されるトークン。 scp host:public_ht
は、ではなく、host:public_ht
です。証明:あなたはfoobar host:public_ht
を完了しようとした場合、置換トークンがちょうどpublic_ht
あるので
$ _foobar() { COMPREPLY=bazcux; return 0; }
$ complete -o default -F _foobar foobar
$ echo $COMP_WORDBREAKS
"'><=;|&(:
は、あなたがfoobar host:bazcux
を取得します。しながら:それはbazcux
に置き換えられて、完全なhost:public_ht
あるので
$ COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
$ echo $COMP_WORDBREAKS
"'><=;|&(
あなたはfoobar host:public_ht
を完了しようとした場合、あなたはfoobar 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
(明らかに)はるかに簡単な解決策は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
を知らないし、具体的な補完を提案するためにもっと多くの文脈を考慮すると、おそらく多くの改善があるだろう。しかし、それは出発点かもしれない。
これはあなたの問題を解決することはできませんが、補足スクリプトは*ソース*(通常は '〜/ .bashrc'または'/etc/bash.bashrc')になりますので、シバン行は重要ではありません。 * sh *が無視されていない場合、 'sh'は配列について知りませんが、あなたはそれらを使います。 –