समान चिह्न के बाद स्वतः पूर्ण पथ पर बैश पूर्ण स्क्रिप्ट बनाएं?


11

मैं एक बैश पूर्ण स्क्रिप्ट बनाना चाहता हूं, जो फॉर्म के तर्कों को पहचानती है --argऔर --some-arg=file

इस ट्यूटोरियल और कुछ उदाहरणों को पढ़ने के बाद /usr/share/bash_completion/completions/, मैंने निम्नलिखित स्क्रिप्ट (क्रोमियम के साथ कुछ झंडे टाइप करने में समय बचाने के लिए) लिखी है:

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=file
    if [[ ${cur} == "--"*"=" ]] ; then
        # Removed failures (is my logic OK?)
        return 0
    fi

    # Handle other options
    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _chromium chromium

मैंने इसे सहेजा ~/bash_completions/chromium, और उपयोग करके एक सिमलिंक बनाया sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
फिर मैंने इसका उपयोग करके लोड किया . /usr/share/bash_completions/completions/chromium

अब, मैं दो समस्याओं का सामना कर रहा हूँ:

  • chromium --u<TAB>के लिए फैलता है chromium --user-data-dir=<SPACE>(मुझे जगह नहीं चाहिए)।
  • पथ (निर्देशिका और फ़ाइलें) पूर्ण नहीं हैं।

मैं इन समस्याओं को कैसे हल कर सकता हूं?


एक विकल्प के लिए स्विचिंग zsh है?
गाइल्स का SO- बुराई से दूर रहना '

जवाबों:


11

मैंने दोनों समस्याओं का हल ढूंढ लिया है!

  1. किसी स्थान को जोड़ने के लिए नहीं, nospaceविकल्प का उपयोग करें । इसे दो तरीकों से किया जा सकता है:

    • इसे पास करें complete:
      complete -o nospace -F _chromium chromium
    • का प्रयोग करें compoptनिर्मित:
      compopt -o nospace(विकल्प को सक्षम करने के लिए)
      compopt +o nospace(विकल्प को अक्षम करने के लिए)

    मुझे यह gash.org , 8.7 प्रोग्रामेबल कम्प्लीमेंटेशन बिलिन्स में बैश डॉक्यूमेंटेशन में मिला

  2. फाइलों को पूरा करना।
    • पीटरफ ने-f ध्वज के साथ उपयोग करने का सुझाव दियाcompgen । मैंने उस सलाह का पालन किया, और इसे लागू किया COMPREPLY=( $(compgen -f "$cur") )। यह ठीक काम करता है, जब तक कि मैंने रिक्त स्थान वाले एक पथ को पूरा करने की कोशिश नहीं की।
      स्टैक ओवरफ्लो पर, मुझे यह उत्तर मिला जो पूर्ण सूची (उपयोग किए बिना compgen) के मैनुअल निर्माण की सिफारिश करता है । इस दृष्टिकोण ने ठीक काम किया।
    • filenamesReadline को बताने के लिए विकल्प का उपयोग करें कि compspec फ़ाइल नाम बनाता है, इसलिए यह कर सकता है:
      • कोई भी फ़ाइलनाम-विशिष्ट प्रसंस्करण करें (जैसे निर्देशिका नामों में एक स्लैश जोड़ना, विशेष वर्णों को उद्धृत करना, या अनुगामी स्थानों को दबाना)
      • फ़ाइल प्रकार को इंगित करने के लिए विभिन्न रंगों का उपयोग करें ( colored-statsसक्षम के साथ )

की सहायता के साथ बैश की स्ट्रिंग परिवर्तन (विस्तार करने के लिए ~और रिक्त स्थान के साथ सौदा), मैं एक bash पूरा होने स्क्रिप्ट जो सभी मानदंडों को सवाल में कहा गया है को पूरा करती है का निर्माण किया।

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=
    if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
        compopt -o filenames
        COMPREPLY=(*)
        return 0
    fi
    # Handle --xxxxx=path
    if [[ ${prev} == '=' ]] ; then
        # Unescape space
        cur=${cur//\\ / }
        # Expand tilder to $HOME
        [[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
        # Show completion if path exist (and escape spaces)
        compopt -o filenames
        local files=("${cur}"*)
        [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
        return 0
    fi

    # Handle other options
    COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
    if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
        # If there's only one option, without =, then allow a space
        compopt +o nospace
    fi
    return 0
}
complete -o nospace -F _chromium chromium

बहुत बढ़िया जवाब, बहुत बहुत धन्यवाद। आपने मेरा बहुत समय बचाया है। मैंने -fफ़ाइल पथ के पूरा होने के लिए स्विच का उपयोग किया , लेकिन /अगर यह एक निर्देशिका है तो यह पूरी नहीं करता है ... हालांकि यह एक छोटी सी बात है।
जिरी क्रेमर

1

फ़ाइलनाम को पूरा करने के लिए पास -fकरने का प्रयास करें compgen

मुझे डर है कि आप विकल्पों के बाद रिक्त स्थान से छुटकारा पाने में सक्षम नहीं होंगे, क्योंकि यह कैसे काम करता है - एक बार जब यह एक अनूठा मैच पाता है, तो यह इसे पूरी तरह से पूरा करता है।


के सुझाव के लिए धन्यवाद -f। मैंने इसकी कोशिश की, लेकिन यह रिक्त स्थान से सही तरीके से नहीं निपटता है: पथ /tmp/foo barदो पूर्ण प्रविष्टियों /tmp/fooऔर में परिणाम देता है bar। अवांछित के बारे में --arg=<SPACE>: मुझे इसका हल मिल गया है, और इसे नीचे दिए गए उत्तर में पोस्ट कर दिया है
रॉ डब्ल्यू डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.