2016-08-26 9 views
9

मैं PHP उपकरण http://robo.li और n98-magerun.phar का उपयोग कर रहा हूं - दोनों सिम्फनी के सीएलआई घटकों पर आधारित हैं।सिम्फनी आधारित स्वत: पूर्ण ब्रेक एससीपी स्वत: पूर्ण

जब मैं इस तरह के एक स्वत: पूर्ण स्क्रिप्ट का उपयोग:

https://gist.github.com/caseyfw/51bdbcb37e5dfb91b74e 

#!/bin/sh 
function __robo_list_cmds() 
{ 
     robo list --raw | awk '{print $1}' | sort 
} 

function __robo_list_opts() 
{ 
    robo list --no-ansi | sed -e '1,/Options:/d' -e '/^$/,$d' -e 's/^ *//' -e 's/ .*//' | sort 
} 

_robo() 
{ 
    local cur="${COMP_WORDS[COMP_CWORD]}" 
    COMPREPLY=($(compgen -W "$(__robo_list_opts) $(__robo_list_cmds)" -- ${cur})) 
    return 0; 
} 

complete -o default -F _robo robo 
COMP_WORDBREAKS=${COMP_WORDBREAKS//:} 

यह scp आदेश के स्वत: पूर्ण (जो आमतौर पर एक दूरस्थ सर्वर पर फ़ाइलों को पूरा करता है टूट जाता है - लेकिन इस के साथ - असंबंधित - जगह में रोबो पूरा होने, SCP हटा देगा कमांड से होस्ट नाम)

वह क्यों है? कैसे ठीक करना है?

संपादित

उत्तर के आधार पर, तय संस्करण यहाँ है:

https://gist.github.com/amenk/d68f1fe54b156952ced621f771ff48ba

+2

यह आपकी समस्या का समाधान नहीं करेगा, लेकिन साइड नोट: समापन स्क्रिप्ट * sourced *, (आमतौर पर '~/.bashrc' या'/etc/bash.bashrc' में) है, इसलिए शेबांग लाइन अपरिहार्य है। अगर इसे * अनदेखा नहीं किया गया था, तो चीजें टूट जाएंगी क्योंकि 'sh' को सरणी के बारे में पता नहीं है, लेकिन आप उनका उपयोग करते हैं। –

उत्तर

3

यह शायद अपने 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 पता नहीं है और शायद कई सुधार हैं जो विशिष्ट समापन का प्रस्ताव देने के लिए खाते में अधिक संदर्भ लेते हैं। लेकिन यह एक शुरुआती बिंदु हो सकता है।

+0

"आपकी समस्या का समाधान शायद आपके _robo समापन समारोह को अनुकूलित करने के लिए है, जैसे कि इसकी आवश्यकता नहीं है: एक शब्द विभाजक नहीं है।" यह कैसे काम करेगा? मोटे तौर पर? यह उन शब्दकोषों की आवश्यकता कहां है? – Alex

+0

आह, बात यह है कि रोबो/सिम्फनी कमांड इस तरह हैं: 'रोबो मुख्य: सब: सबबॉम कमांड' तो शायद यही कारण है कि शब्द का प्रयोगकर्ता जगह में आता है। क्या 'शब्द' विभाजक को 'रोबो' और 'मैगेरुन' के लिए सक्रिय करना संभव है, न कि 'एसपीपी' के लिए? – Alex

+1

@Alex No, मुझे नहीं लगता कि आप दुर्भाग्यवश, प्रति कमांड 'COMP_WORDBREAKS' विशेषज्ञ कर सकते हैं। आपको वास्तव में थोड़ा और जटिल '_robo' फ़ंक्शन 1 को लागू करना होगा)' COMP_CWORDS 'से शुरू होने वाली 'COMP_WORDS' सरणी को' main: sub: subsu' stem, 2) बनाने के लिए पीछे 'comp_WORDS' सरणी को पार्स करें) सभी को प्राप्त करने के लिए' compgen' पर कॉल करें ' संभव समापन, 3) उनसे स्टेम हटा दें और परिणाम वापस कर दें। ध्यान दें कि उनकी दो संभावनाएं हैं: शब्द-स्तरीय पूर्णता ('' 'पर रोकना, जैसे पथ समापन'/'पर बंद हो जाता है) या पूर्ण समूह पूर्णता। ये तुम्हारी पसंद है। –

संबंधित मुद्दे