2012-08-29 12 views

Respuesta

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

Explicación:

Typing git checkout <Control-x><h> invoca _complete_help que expone el funcionamiento interno de cómo el sistema de finalización de zsh actuaría si presionó TAB en el contexto actual (en lugar de presionar <Control-x><h>). A partir de esto, es posible ver que zsh invocaría la función __git_heads para completar los nombres de las cabeceras de rama git. Si a continuación, escribe which __git_heads, se puede ver que estos nombres cabeza rama se obtienen a través de:

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

Por suerte para nosotros, _call_program está diseñado específicamente para permitir al usuario cambiar el comportamiento predeterminado. Por lo tanto, el comando zstyle anterior indica a zsh que use una invocación alternativa git for-each-ref ... en lugar de la invocación incorporada, y puede ver que en la invocación anterior eliminé el parámetro refs/remotes. El primer parámetro para zstyle es el contexto de finalización, y aquí significa "cada vez que el sistema de finalización solicita la finalización para la etiqueta headrefs cuando el usuario está completando un argumento para git checkout. Por lo tanto, este zstyle afectará git checkout, y no cualquier otro git comandos-.

+0

¿Cómo se podría dividir el control remoto y local en dos secciones separadas en el autocompletado? P.ej. Me encantaría tener las cabezas especiales ('HEAD',' ORIG_HEAD', 'FETCH_HEAD', etc.), luego ramas locales, luego ramas remotas. No es obvio para mí cómo se haría eso. Si es fácil expandir tu respuesta, sería genial. Si no, abriré una nueva pregunta. –

+0

Hay * probablemente * una manera de hacerlo, después de todo, hay un mecanismo de agrupación (buscar 'group-name' y' group-order' en el manual) pero no sé de antemano cómo dividir el varias cabezas se dirigen a estos grupos, por lo que probablemente valga la pena una pregunta por separado. –

-1

Puede desactivar el auto-completado en git checkout añadiendo esta línea a su .zshrc archivo:

compdef -d git checkout 
+1

Estaba buscando una forma de evitar la autocompletación de las sucursales remotas. Sin embargo, me gustaría tener autocompletar de las sucursales locales. –

+0

@ GalderZamarreño Temo que está más allá del alcance de mi conocimiento de zsh; podría probar la lista zsh; parecen personas serviciales. – Christopher

1

Parece que __git_heads ahora sólo comprueba las secciones locales, pero los archivos de compleción de llamadas __git_refs lugar.

Pirateé en esta aplicando este parche a git-completion.bash, que se aproxima a través por el comando 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 la finalización instantánea en lugar de 10 segundos.

1

Al escribir git checkout <Ctrl-X><H> que ver un montón de etiquetas, algunas de las cuales 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, tenemos que cambiar remote-branch-names-noprefix 's comportamiento para dejar de proporcionar nombres sucursales remotas sin prefijo.

comprobar, vamos a ver qué entradas de estas etiquetas están asociados con, el uso:

$ 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 después de los nombres de las etiquetas anteriores, hay una cadena de comandos que condujo a una entrada de autocompletar está generando por esa etiqueta. En la cadena remote-branch-names-noprefix, puede ver __git_remote_branch_names_noprefix que parece relevante. Mira 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]" 
} 

Se puede ver cómo se utiliza para definir _call_programremote-branch-refs-noprefix. Queremos cambiar esta definición en el caso git-checkout.Al reemplazarlo por "eco", dejará de proporcionar entradas de autocompletar:

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