回答
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
子 - 命令。
可以通過添加此行到您的.zshrc
文件上git checkout
禁用自動完成:
compdef -d git checkout
我正在尋找避免自動完成遠程分支的方法。儘管如此,我想自動完成本地分支機構。 –
@GalderZamarreño害怕這超出了我的zsh知識的範圍;可能會嘗試zsh列表;他們看起來很有幫助的人。 – Christopher
看來,__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秒。
通過鍵入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"
- 1. zsh的自動完成
- 2. 如何禁用svn的zsh自動完成
- 3. zsh中的自動完成反斜槓
- 4. Codemirror遠程自動完成
- 5. 自定義zsh自動完成
- 6. git:禁用自動推送到某個遠程分支
- 7. 在R studio中禁用自動完成
- 8. Flask_WTF:PasswordField禁用自動完成
- 9. Zsh:智能自動完成功能?
- 10. 寫一個ZSH自動完成功能
- 11. jquery:遠程xml源的自動完成
- 12. 如何將分支創建者添加到zsh中的`git checkout`分支完成?
- 13. 在zsh之外使用zsh完成
- 14. 遠程緩存自動完成問題
- 15. jquery自動完成遠程數據源
- 16. JQuery自動完成遠程數據
- 17. Jquery自動完成遠程數據源
- 18. 自動完成與遠程來源
- 19. 如何使用通配符在zsh中的遠程服務器上自動完成?
- 20. 如何使用URL和反斜槓禁用zsh替換/自動完成
- 21. 如何在jQuery自動完成中調用遠程數據源?
- 22. 從遠程源jQuery UI的自動完成分類
- 23. Lua支持在emacs中自動完成
- 24. 使用命令輸出爲zsh生成自動完成命令
- 25. 禁用jQuery自動完成功能使得自動完成功能部分透明,而不是禁用
- 26. 禁用自動完成擴展程序完成列表中的項目
- 27. 自動完成支架 - Zerobrane
- 28. 遠程完成Android活動
- 29. 在zsh中使用bash完成-C -C
- 30. 自定義腳本的zsh完成
如何將自動完成中的遠程和本地分爲兩個獨立的部分?例如。我很想擁有特殊的頭像('HEAD','ORIG_HEAD','FETCH_HEAD'等),然後是本地分支,然後是遠程分支。這對我來說是不明顯的。如果擴大你的答案很容易,那將是膨脹的。如果不是,我會開一個新的問題。 –
有*可能*一種方式來做到這一點 - 畢竟,有一個分組機制(在手冊中搜索'group-name'和'group-order'),但我不知道如何分割各種各樣的頭對這些小組 - 可能值得一個單獨的問題。 –