¿Inhabilita la finalización automática de twigs remotas en Zsh?

¿Esto está relacionado con Deshabilitar la autocompletación de sucursales remotas en Git Bash? .

¿Alguien sabe cómo hacer lo mismo con zsh?

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

Explicación:

Escribir git checkout <Control-x><h> invoca _complete_help que expone las _complete_help internas de cómo actuaría el sistema de finalización de zsh si presionó TAB en el context actual (en lugar de presionar <Control-x><h> ). A partir de esto, es posible ver que zsh invocaría la function __git_heads para completar los nombres de las cabeceras de twig git. Si luego escribe which __git_heads , puede ver que estos nombres de cabezas de bifurcación se obtienen a través de:

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

Afortunadamente para nosotros, _call_program está diseñado específicamente para permitir al usuario cambiar el comportamiento pnetworkingeterminado. Así que el command zstyle anterior instruye a zsh para que use una invocación alternativa git for-each-ref ... lugar de la invocación incorporada, y puede ver que en la invocación anterior refs/remotes parámetro refs/remotes . El primer parámetro para zstyle es el context de finalización, y aquí significa "siempre que el sistema de finalización solicite la finalización de la label headrefs cuando el usuario está completando un argumento para el git checkout . Así que este zstyle solo afectará el git checkout , y no cualquier otro git

Parece que __git_heads ahora solo comtesting las sucursales locales, pero los files de finalización llaman __git_refs en __git_refs lugar.

Lo pirateé aplicando este parche a git-completion.bash , que es _git por el command 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 } 

No es una solución perfecta, pero funciona para mis casos de uso y hace que la finalización sea instantánea en lugar de 10 segundos.

Al escribir git checkout <Ctrl-X><H> ves un montón de tags, algunas que parecen relevantes son:

 $ 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) [...] 

A primera vista, necesitamos cambiar remote-branch-names-noprefix comportamiento de los nombres de las sucursales remotas remote-branch-names-noprefix para dejar de proporcionar nombres de sucursales remotas sin prefijo.

Para volver a verificar, veamos con qué inputs están asociadas estas tags, utiliza:

 $ 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 

En el paréntesis que sigue a los nombres de las tags anteriores, hay una cadena de commands que conducen a que se genere una input de autocomplete para esa label. En la cadena remote-branch-names-noprefix puede ver __git_remote_branch_names_noprefix que parece relevante. Busque en /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]" } 

Puede ver cómo _call_program se usa para definir remote-branch-refs-noprefix . Queremos cambiar esta definición en el caso de git-checkout . Al replacelo con "echo", dejará de proporcionar inputs de autocomplete:

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

Puede deshabilitar la finalización automática en el git checkout al agregar esta línea a su file .zshrc :

 compdef -d git checkout