これは、Git Bashのリモートブランチのオートコンプリートを無効にすることに関連していますか?。
誰もがzshで同じことをする方法を知っていますか?
zstyle :completion::complete:git-checkout:argument-rest:headrefs command "git for-each-ref --format='%(refname)' refs/heads 2>/dev/null"
説明:
入力すると、現在のコンテキストで(を押す代わりに)TABを押した場合に、zshの完了システムがどのように動作するかを明らかにするgit checkout <Control-x><h>
呼び出しが呼び出されます。これから、zshが関数を呼び出してgitブランチヘッドの名前を完成させることがわかります。次に、と入力すると、これらのブランチヘッド名が次の方法で取得されていることがわかります。_complete_help
<Control-x><h>
__git_heads
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
toの最初のパラメーターzstyle
は完了コンテキストであり、ここでは「ユーザーがの引数を完了しているときに、完了システムがheadrefs
タグの完了を要求しているときはいつでもgit checkout
。したがって、これzstyle
はにのみ影響git checkout
し、他のgit
サブコマンドには影響しません。
入力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' "$@"
}
_call_program
の定義にどのように使用されているかがわかりますremote-branch-refs-noprefix
。git-checkout
の場合、この定義を変更したいと思います。「echo」に置き換えると、オートコンプリートエントリの提供が停止します。
zstyle ':completion::complete:git-checkout:argument-rest:remote-branch-refs-noprefix' command "echo"
__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>
tags in context :completion::complete:git::
argument-rest (_arguments _git)
tags in context :completion::complete:git-checkout::
argument-rest options (_arguments _git-checkout _call_function _git)
tags in context :completion::complete:git-checkout:argument-rest:
remote branches tree-ishs modified-files (_alternative _git-checkout _call_function _git)
remote-branch-names-noprefix (__git_remote_branch_names_noprefix _alternative _git-checkout _call_function _git)
heads commit-tags commit-objects (_alternative __git_commits __git_tree_ishs _alternative _git-checkout _call_function _git)
heads-local (__git_heads_local __git_heads _alternative __git_commits __git_tree_ishs _alternative _git-checkout _call_function _git)
commit-tags (__git_tags_of_type __git_commit_tags _alternative __git_commits __git_tree_ishs _alternative _git-checkout _call_function _git)
modified-files (__git_files __git_modified_files _alternative _git-checkout _call_function _git)
この出力関数には、コマンドの完了を生成する機能があります。でこの関数をオーバーライドできます.zshrc
。これを設定ファイルの一番上に置きます:
__git_heads_remote() {}
その後、完了時にリモートヘッドは表示されません。これは、どの関数に対しても実行できます。
次の行をファイルgit checkout
に追加することで、オートコンプリートを無効にできます。.zshrc
compdef -d git checkout