2012-08-29 21 views

उत्तर

9
zstyle :completion::complete:git-checkout:argument-rest:headrefs command "git for-each-ref --format='%(refname)' refs/heads 2>/dev/null" 

स्पष्टीकरण:

टाइप करना git checkout <Control-x><h> invokes _complete_help जो कैसे zsh के पूरा होने प्रणाली के आंतरिक भागों को उजागर करता है अगर आप वर्तमान संदर्भ में टैब दबाएंगे (<Control-x><h> दबाए जाने के बजाय) कार्य करेगा। इससे यह देखना संभव है कि zsh गिट शाखा प्रमुखों के नामों को पूरा करने के लिए __git_heads फ़ंक्शन का आह्वान करेगा। आप तो लिखते हैं, तो which __git_heads, जैसा कि आप देख सकते हैं कि इन शाखा सिर नामों के माध्यम से प्राप्त कर रहे हैं:

_call_program headrefs git for-each-ref --format='"%(refname)"' refs/heads refs/remotes 2>/dev/null 

हमारे लिए सौभाग्य से, _call_program विशेष रूप से उपयोगकर्ता डिफ़ॉल्ट व्यवहार को बदलने के लिए अनुमति देने के लिए बनाया गया है। तो उपर्युक्त zstyle आदेश अंतर्निहित एक के बजाय वैकल्पिक git for-each-ref ... आमंत्रण का उपयोग करने के लिए zsh को निर्देश देता है, और आप देख सकते हैं कि उपरोक्त आमंत्रण में, मैंने refs/remotes पैरामीटर को हटा दिया। zstyle का पहला पैरामीटर पूरा करने का संदर्भ है, और यहां इसका अर्थ है "जब भी पूर्णता प्रणाली headrefs टैग के लिए पूरा होने का अनुरोध कर रही है, तो उपयोगकर्ता git checkout के लिए तर्क पूरा कर रहा है। तो यह zstyle केवल git checkout को प्रभावित करेगा, और कोई अन्य git उप नहीं -commands।

+0

ऑटो-पूर्ण में रिमोट और स्थानीय को दो अलग-अलग अनुभागों में कैसे विभाजित किया जाएगा? जैसे मुझे विशेष सिर ('HEAD',' ORIG_HEAD', 'FETCH_HEAD', आदि), फिर स्थानीय शाखाएं, फिर दूरस्थ शाखाएं पसंद हैं। यह मेरे लिए स्पष्ट नहीं है कि यह कैसे किया जाएगा। यदि आपके उत्तर का विस्तार करना आसान है, तो यह सूख जाएगा। यदि नहीं, तो मैं एक नया प्रश्न खोलूंगा। –

+0

* संभवतः ऐसा करने का एक तरीका है - आखिरकार, समूहबद्ध तंत्र (मैन्युअल में 'समूह-नाम' और 'समूह-आदेश' के लिए खोजें) लेकिन मुझे पता नहीं है कि कैसे विभाजित किया जाए इन समूहों में विभिन्न सिर बाहर - तो शायद एक अलग सवाल के लायक है। –

-1

आप अपने .zshrc फाइल करने के लिए इस लाइन जोड़कर git checkout पर स्वत: पूर्ण करने निष्क्रिय कर सकते हैं:

compdef -d git checkout 
+1

मैं ऐसे तरीकों की तलाश में था जो दूरस्थ शाखाओं के स्वत: पूर्ण होने से बचा था। हालांकि मैं स्थानीय शाखाओं के ऑटो-पूर्ण होना चाहता हूं। –

+0

@ GalderZamarreño डर है कि मेरे zsh ज्ञान के दायरे से परे है; zsh सूची का प्रयास कर सकते हैं; वे सहायक लोगों की तरह लगते हैं। – Christopher

1

ऐसा लगता है कि __git_heads अब केवल स्थानीय शाखाओं की जाँच करता है, लेकिन पूरा होने फ़ाइलों के बजाय __git_refs कहते हैं।

मैं git-completion.bash, जो zsh _git आदेश द्वारा करने के लिए के माध्यम से प्रॉक्सी है करने के लिए इस पैच लगाने से इस हैक कर लिया :

--- git-completion.bash.old 2015-04-02 16:09:38.000000000 -0700 
+++ git-completion.bash  2015-04-02 16:10:24.000000000 -0700 
@@ -1032,13 +1032,7 @@ 
        " 
      ;; 
    *) 
-   # check if --track, --no-track, or --no-guess was specified 
-   # if so, disable DWIM mode 
-   local flags="--track --no-track --no-guess" track=1 
-   if [ -n "$(__git_find_on_cmdline "$flags")" ]; then 
-     track='' 
-   fi 
-   __gitcomp_nl "$(__git_refs '' $track)" 
+   __gitcomp_nl "$(__git_heads)" 
      ;; 
    esac 
} 

यह एक सही समाधान नहीं है, लेकिन यह मेरे उपयोग के मामलों के लिए काम करता है और 10 सेकंड के बजाय पूरा होने देता है।

1

git checkout <Ctrl-X><H> लिखकर आपके टैग का एक समूह देखते हैं, कुछ जो प्रासंगिक प्रतीत होते हैं:

$ git checkout 
tags in context :completion::complete:git-checkout:argument-rest: 
    remote-branch-names-noprefix    (__git_describe_branch __git_describe_commit __git_remote_branch_names_noprefix _git-checkout _git) 
    heads-remote        (__git_describe_branch __git_describe_commit __git_heads_remote __git_heads __git_commits __git_tree_ishs _git-checkout _git) 
    [...] 

पहली नजर में, हम remote-branch-names-noprefix के व्यवहार को बदलने की कोई उपसर्ग के साथ दूरदराज के शाखा नाम देना, को रोकने के लिए की जरूरत है।

दोहरी जांच करने के लिए

, चलो देखते हैं कि इन टैग, उपयोग के साथ जुड़े रहे हैं प्रविष्टियां करते हैं:

$ zstyle ':completion:*' group-name '' 
$ zstyle ':completion:*' format 'Completing "%d":' 
$ git checkout T<Tab> 
Completing "remote branch name": 
T3522-plugins_and_stuff T7482 
Completing "local head": 
T7626-async 

कोष्टक में ऊपर टैग नाम निम्नलिखित, वहाँ जो एक स्वत: पूर्ण प्रविष्टि उत्पन्न किया जा रहा करने के लिए नेतृत्व आदेशों की एक श्रृंखला है उस टैग के लिए। remote-branch-names-noprefix की श्रृंखला में आप __git_remote_branch_names_noprefix देख सकते हैं जो प्रासंगिक लगता है। /usr/share/zsh/functions/Completion/Unix/_git में देखो:

(($+functions[__git_remote_branch_names_noprefix])) || 
__git_remote_branch_names_noprefix() { 
    declare -a heads 

    branch_names=(${${${${(f)"$(_call_program remote-branch-refs-noprefix git for-each-ref --format='"%(refname)"' refs/remotes 2>/dev/null)"}#refs/remotes/}#*/}:#HEAD}) 
    __git_command_successful $pipestatus || return 1 

    __git_describe_commit branch_names remote-branch-names-noprefix 'remote branch name' "[email protected]" 
} 

आप देख सकते हैं कि _call_programremote-branch-refs-noprefix परिभाषित करने के लिए प्रयोग किया जाता है। हम इस परिभाषा को git-checkout के मामले में बदलना चाहते हैं।इसे "गूंज" के साथ बदलकर, यह स्वत: पूर्ण प्रविष्टियां प्रदान करना बंद कर देगा:

zstyle ':completion::complete:git-checkout:argument-rest:remote-branch-refs-noprefix' command "echo" 
संबंधित मुद्दे