2015-04-29 10 views
29

कहो बैश निम्नलिखित उर्फ ​​साथ कॉन्फ़िगर किया गया है:बैश पूरा होने: उर्फ ​​पूरा होने में ऑनर भंडार विशेष Git उर्फ ​​

alias up="git --git-dir /path/to/backup/.git"

और उस विशेष भंडार - और केवल कि भंडार - निम्नलिखित Git उपनाम है:

[alias] 
backup = commit --allow-empty-message 

up ऑटो-पूर्ण backup कैसे हो सकता है?


यह स्वत: पूर्ण करता backup नहीं बल्कि up:

cd /a/different/dir 
git --git-dir=/path/to/backup/.git ba 

यह मानक Git आदेशों के साथ स्वत: पूर्ण करता up नहीं बल्कि backup:

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up


संपादित: Etan सही है, पूरा होने के समारोह का विस्तार उर्फ ​​देखना पसंद करते हैं, तो मैं निम्नलिखित बना लिया है:

CompletableAlias() { 
    if (($#<2)); then 
     return 1 
    fi 
    source_c="$1" 
    target_c="$2" 
    target_a=("${@:2}") 
    target_s="${target_a[*]}" 
    alias "${source_c}=${target_s}" 
    completion_modifier="__${source_c}_completion" 
    completion_original="$(complete -p "$target_c" 2>/dev/null | 
          sed 's/.*-F\W\+\(\w\+\).*/\1/' 
         )" 
    if [[ -n "$completion_original" ]]; then 
     read -r -d '' completion_function <<-EOF 
     function $completion_modifier() { 
      COMP_LINE="\${COMP_LINE/#${source_c}/${target_s}}" 
      ((COMP_POINT+=${#target_s}-${#source_c})) 
      ((COMP_CWORD+=${#target_a[@]}-1)) 
      COMP_WORDS=(${target_a[@]} \${COMP_WORDS[@]:1}) 
      $completion_original 
     } 
EOF 
     eval "$completion_function" 
     completion_command="$(complete -p "$target_c" | 
           sed "s/${completion_original}/${completion_modifier}/; 
            s/\w\+\$/${source_c}/" 
          )" 
     $completion_command 
    fi 
} 


source "/usr/share/bash-completion/completions/git" 

CompletableAlias "up" "git" "--git-dir" "/path/to/backup/.git" 

लेकिन वहाँ भरी समस्याओं:

  • up bac<Tab>
  • काम नहीं करता है
  • up <Tab> डिफ़ॉल्ट पूरा होने का उपयोग करता है और Git subcommands की सूची नहीं है
  • और कई और अधिक ...

संपादित 2: स्क्रिप्ट अपडेट किया गया Re: Bash completion of aliased commands पर ऊपर उल्लिखित समस्याओं सुझावों का उपयोग करके ठीक करने के लिए। जाहिर है यह एक बहुत ही आम काम है। लेकिन अब मैं यह त्रुटि संदेश में चल रहा हूँ:

$ cd /a/different/dir 
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git 
+0

क्या पूरा करने का कार्य 'ऊपर' या विस्तारित उपनाम देखता है? –

+0

यदि पूरा कार्य कमांड में 'अप' के रूप में पढ़ता है तो यह अपेक्षित व्यवहार नहीं करेगा, 'बैकअप' में विस्तार करने के लिए एक द्वितीयक फ़ंक्शन का उपयोग करें ताकि आप सुनिश्चित हो सकें कि पूर्ण आदेश पूर्ण करने के कार्य को भेजा जा रहा है। इस तरह यह कई पूर्ण कार्यों के साथ है, वे उम्मीद करते हैं (या मानते हैं) कि आदेश वह है जिसे उन्होंने * प्रोग्राम किया था। इसलिए, यदि आप जाते हैं और किसी अन्य कमांड के लिए एक पूरक संलग्न करते हैं, तो यह काम नहीं करेगा (इसलिए मध्य-व्यक्ति कार्य)। शुरू करने के लिए आप दो को कॉल करने से -xv से कुछ आउटपुट दिखा सकते हैं, यह सुनिश्चित करने के लिए कि आपका फ़ंक्शन वह कर रहा है जो आप उम्मीद करते हैं (या इसके अंतर) – osirisgothra

उत्तर

1

आप वास्तव में इस तरह के अन्य नामों के जटिल मामलों में, उपयोग नहीं करना चाहिए bash functions का उपयोग करें। एलिस सी (पूर्व में उपयोग करने के अर्थ में) में प्री-प्रोसेसर की तरह अधिक होते हैं, जब फ़ंक्शन अधिक होते हैं ... कोड फ़ंक्शंस। और मैंने पाया है कि वे और भी "ऑटो-पूर्ण करने योग्य" हैं।

आप यह भी देख सकते हैं कि इस समस्या को अन्य गोले, जैसे fish पर हल किया जा रहा है।

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