यह शायद अपने 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
मिलता है क्योंकि यह पूरा 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
एक बहुत (जाहिरा तौर पर) सरल समाधान 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
पता नहीं है और शायद कई सुधार हैं जो विशिष्ट समापन का प्रस्ताव देने के लिए खाते में अधिक संदर्भ लेते हैं। लेकिन यह एक शुरुआती बिंदु हो सकता है।
स्रोत
2017-08-17 14:00:53
यह आपकी समस्या का समाधान नहीं करेगा, लेकिन साइड नोट: समापन स्क्रिप्ट * sourced *, (आमतौर पर '~/.bashrc' या'/etc/bash.bashrc' में) है, इसलिए शेबांग लाइन अपरिहार्य है। अगर इसे * अनदेखा नहीं किया गया था, तो चीजें टूट जाएंगी क्योंकि 'sh' को सरणी के बारे में पता नहीं है, लेकिन आप उनका उपयोग करते हैं। –