14

これは、Git Bashのリモートブランチのオートコンプリートを無効にすることに関連していますか?

誰もがzshで同じことをする方法を知っていますか?

4

5 に答える 5

12
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_headswhich __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/remotestoの最初のパラメーターzstyleは完了コンテキストであり、ここでは「ユーザーがの引数を完了しているときに、完了システムがheadrefsタグの完了を要求しているときはいつでもgit checkout。したがって、これzstyleはにのみ影響git checkoutし、他のgitサブコマンドには影響しません。

于 2013-06-16T12:21:52.677 に答える
3

入力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-noprefixgit-checkoutの場合、この定義を変更したいと思います。「echo」に置き換えると、オートコンプリートエントリの提供が停止します。

zstyle ':completion::complete:git-checkout:argument-rest:remote-branch-refs-noprefix' command "echo"
于 2016-11-29T15:56:28.150 に答える
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秒ではなく瞬時に完了します。

于 2015-04-02T23:14:36.073 に答える
0

誰も私を助けません。これを試して:

$ 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() {}

その後、完了時にリモートヘッドは表示されません。これは、どの関数に対しても実行できます。

于 2018-03-27T08:39:13.263 に答える
-2

次の行をファイルgit checkoutに追加することで、オートコンプリートを無効にできます。.zshrc

compdef -d git checkout
于 2012-08-29T13:17:02.463 に答える