2010-02-26 10 views
9

मैं जावा प्रोग्राम के लिए बैश पूर्णता स्क्रिप्ट बनाने की कोशिश कर रहा हूं। कि इस कार्यक्रम का एक विशिष्ट मंगलाचरण इस प्रकार दिखाई देंगे:कुछ बैश स्वत: पूर्ण विकल्पों के अंत में रिक्त स्थान जोड़ें, लेकिन दूसरों के लिए नहीं?

$ javaProgram -Dproperty=foo option1 option2 

मेरी स्क्रिप्ट का हिस्सा विभिन्न जावा गुण है कि (इस कार्यक्रम के लिए उपलब्ध यानी, जब उपयोगकर्ता -D, स्क्रिप्ट सुझाव है कि कर रहे हैं सुझाव देने के लिए किया जाएगा, कहें, property=, उपयोगकर्ता को मान टाइप करने की इजाजत देता है)।

मैं पूरा होने की तरह एक अंतरिक्ष के बाद बराबर चिह्न सम्मिलित नहीं करने के लिए चाहते हैं। हालांकि, जब उपयोगकर्ता उपरोक्त उदाहरण में प्रोग्राम के लिए विभिन्न विकल्प टाइप कर रहा है (option1 और option2), तो मैं स्क्रिप्ट को पूरा करने के लिए चाहता हूं, और इसे पूरा होने पर एक स्थान डालें।

मैं बैश पूर्णता स्क्रिप्टिंग के लिए नया हूं, लेकिन मुझे nospace विकल्प complete शैल बिल्टिन के लिए पता है। यह compgen बिल्टिन के लिए काम नहीं कर रहा है, हालांकि, जो मुझे लगता है जैसा लगता है। मैंने nospace का उपयोग करने का प्रयास किया है, और उसके बाद उचित विकल्पों के अंत में रिक्त स्थान शामिल हैं, लेकिन ऐसा लगता है कि वे इसे बनाते नहीं हैं।

किसी को भी दूसरों के अंत में कुछ विकल्पों के अंत में रिक्त स्थान है, लेकिन कोई रिक्त स्थान पाने के लिए पता है?

उत्तर

1

यह कोड आप अब तक देखने के लिए उपयोगी होगा।

हालांकि, के लिए /etc/bash_completion.d/ssh में पूरा होने पर कोड पूरा होने पर देखें। यह स्थानीय फ़ाइल नामों के बाद रिक्त स्थान रखता है लेकिन होस्टनाम के बाद नहीं।

1

डेनिस पैसे पर सही है, समारोह आप complete -F _your_func साथ संदर्भ में, आप कुछ इस तरह (से/etc/bash_completion लिया गया) हैं:

# escape spaces; remove executables, aliases, pipes and sockets; 
    # add space at end of file names 
    COMPREPLY=($(ssh -o 'Batchmode yes' $userhost \ 
       command ls -aF1d "$path*" 2>/dev/null | \ 
       sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \ 
       -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g')) 
    return 0 

यह विशेष रूप से उदाहरण -o nospace विकल्प का उपयोग करता है, लेकिन कहते हैं अंतरिक्ष मैन्युअल रूप से। यह अंतिम -e ('s/[^\/]$/& /g') है जो अंतरिक्ष जोड़ता है। इस मामले में यह केवल तभी जोड़ रहा है जब अंतिम पैरामीटर स्लैश में समाप्त नहीं होता है (जो एक निर्देशिका होगी और फ़ाइलों को स्वत: पूर्ण करने के लिए) होगा।

मुख्य अंतर यह अंतरिक्ष से पहले एक ampersand जोड़ने जा रहा है। कोशिश करें और देखें कि यह काम करता है या नहीं।

5

सी 4 एच 5 ए द्वारा वर्णित एसपीपी के बैश पूर्णता में सुविधा जो अतिरिक्त स्थान को बरकरार रखती है वह एम्परसेंड नहीं है, जो "मैच के साथ प्रतिस्थापित" के लिए सिर्फ सर वाक्यविन्यास है।

आप आईएफएस बदलने के लिए इतना compgen रिक्त स्थान पर लेकिन नई पंक्तियों या टैब पर इनपुट विभाजित नहीं करता है:

local IFS=$'\t\n' 
COMPREPLY=($(compgen -W "$options" -- $cur)) 
0

आप इसी विकल्प के साथ रिक्त स्थानों को हटाकर यह कर सकते हैं, फिर उन्हें वापस मैन्युअल के लिए जोड़ने

complete -o nospace -W 'Dproperty= "option1 " "option2 "' javaProgram 

स्वत: पूर्णता अब option1 और option2 के बाद खाली स्थान शामिल होगा, लेकिनके बाद से कोई भी: विकल्प जहाँ आप उन्हें चाहते हैं, उन्हें सरल -W ("शब्द सूची") पूरा होने का उपयोग कर 210।

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