2012-08-29 42 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>調用_complete_help暴露出怎樣的zsh的完成系統的內部將在當前上下文中按TAB(而不是按<Control-x><h>)時動作。從這裏可以看到zsh會調用__git_heads函數來完成git分支頭的名字。如果您然後鍵入which __git_heads,你可以看到,這些分公司負責人的名字通過獲得:

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

幸運的是,_call_program是專門設計用來允許用戶更改默認行爲。因此,上述zstyle命令指示zsh使用替代git for-each-ref ...而不是內置調用,並且您可以看到在上面的調用中,我刪除了refs/remotes參數。 zstyle的第一個參數是完成上下文,這裏的意思是「當用戶完成git checkout的參數時,無論何時完成系統請求完成headrefs標記。因此,此zstyle只會影響git checkout,而不會影響其他任何git子 - 命令。

+0

如何將自動完成中的遠程和本地分爲兩個獨立的部分?例如。我很想擁有特殊的頭像('HEAD','ORIG_HEAD','FETCH_HEAD'等),然後是本地分支,然後是遠程分支。這對我來說是不明顯的。如果擴大你的答案很容易,那將是膨脹的。如果不是,我會開一個新的問題。 –

+0

有*可能*一種方式來做到這一點 - 畢竟,有一個分組機制(在手冊中搜索'group-name'和'group-order'),但我不知道如何分割各種各樣的頭對這些小組 - 可能值得一個單獨的問題。 –

-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_program用於定義remote-branch-refs-noprefix。我們想在git-checkout的情況下改變這個定義。通過將其替換爲「回聲」,它將停止提供自動完成條目:

zstyle ':completion::complete:git-checkout:argument-rest:remote-branch-refs-noprefix' command "echo"