Esto se relaciona con Disable auto-completion of remote branches in Git Bash?.¿Inhabilita la finalización automática de sucursales remotas en Zsh?
¿Alguien sabe cómo hacer lo mismo con zsh?
Esto se relaciona con Disable auto-completion of remote branches in Git Bash?.¿Inhabilita la finalización automática de sucursales remotas en Zsh?
¿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:
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-.
Puede desactivar el auto-completado en git checkout
añadiendo esta línea a su .zshrc
archivo:
compdef -d git checkout
Estaba buscando una forma de evitar la autocompletación de las sucursales remotas. Sin embargo, me gustaría tener autocompletar de las sucursales locales. –
@ 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
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.
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_program
remote-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"
¿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. –
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. –