Problema

Problema

Problema

tengo lo siguiente

git reset HEAD^ half_entered_file_n<Tab>

En este punto, me gustaría que half_entered_file_name.txt se complete con pestañas.

mi propia investigacion

Puedo hacer que la función Tabulador funcione si escribo

git reset HEAD\^ ...

en cambio, escapando del "^".

Escribir un "^" como último carácter no parece afectar el autocompletado, a menos que HEAD también esté presente:

#autocomplete works
git reset RANDOM^ half_entered_file_n<Tab> #works

configuración zsh

Estoy usando Oh-my-zsh. Además de oh-my-zsh, configuré lo siguiente que puede ser relevante:

# Let <TAB> auto completion add a slash at the end instead of space (like BASH)
zstyle ':completion:*' special-dirs true 

# Unless this option is set, you can't write git checkout HEAD^^ without escaping ^ as \^ in zsh
setopt NO_NOMATCH 

# Standard git plugins
plugins=(git git-extras)

Por completitud,aquí está mi configuración

Estoy ejecutando esto en OSX en iTerm2.

¡Gracias!

Actualizar

He encontrado algunas semi-soluciones, pero ninguna que conduzca a un estado de "respuesta" todavía, lo que básicamente las convierte en no soluciones.

  1. establecido compdef -d giten .zshrccomo lo propone "cavernícola"
    • Resuelve: Ahora HEAD^ ya no interrumpe el autocompletado de archivos.
    • Desventaja: el autocompletado del comando git ya no funciona.
  2. Utilizar elrespuesta aceptada por "ralphtheninja" de esta pregunta
    • Resuelve: Debería reemplazar la forma en que se genera la lista de finalización de archivos, lo que resolvería el problema.
    • Desventaja: No funciona. Parece que git-completion.zsh/.bash ha cambiado la sintaxis.

No conozco lo suficiente los scripts de shell para entender exactamente qué está pasando en git-completion.zsh/.bash, y si esa es la razón por la que las cosas no funcionan.

Respuesta1

¿Por qué no deberías asumir?

Durante mucho tiempo asumí que la finalización de git en mi configuración de zsh provenía de /usr/local/share/git-core/contrib/completion/, específicamente de git-completion.zsho incluso git-completion.bash. Supongo que estaba asumiendo esto porque la mayoría de las búsquedas arrojarán resultados sobre estos archivos. Sin embargo, no incluí explícitamente ninguno de estos archivos y durante mucho tiempo solo supuse que oh-my-zsh los estaba incluyendo.

Pero...

Ya no estamos en Kansas

No fue hasta que usé el rastreo del método zsh, habilitado a través de setopt xtrace, que me di cuenta (buscando en Google algunos nombres de métodos) que el script que se estaba usando era en realidad /usr/local/share/zsh/functions/_git. Yo había usado anteriormenteAplicación XCode Instruments.para monitorear a qué scripts se accedía en el sistema de archivos, pero no lo descubrió en ese momento (el resultado es bastante hablador y también muestra accesos desde otras aplicaciones).

¿Qué está sucediendo?

Los rastros lo demostraron (¡rastros parciales más adelante!)

git reset HEAD <TAB>
...
+__git_tree_files:17> tree=HEAD
+__git_tree_files:18> tree_files+=+__git_tree_files:18> _call_program tree-files git ls-tree --name-only -z HEAD ./
+__git_tree_files:18> tree_files+=( first second third )

Y

git reset HEAD^ <TAB>
...
+__git_tree_files:17> tree=HEAD^
+__git_tree_files:18> tree_files+=+__git_tree_files:18> _call_program tree-files git ls-tree --name-only -z 'HEAD^' ./
+__git_tree_files:18> tree_files+=( )

Ese vacío tree_filesparece sospechoso.

En la línea 6058 en /usr/local/share/zsh/functions/_gitencontramos

tree_files+=(${(ps:\0:)"$(_call_program tree-files git ls-tree $extra_args --name-only -z $tree $Path 2>/dev/null)"})

Definitivamente necesitamos escapar de esa $treevariable. Dicho y hecho:

tree_files+=(${(ps:\0:)"$(_call_program tree-files git ls-tree $extra_args --name-only -z ${(q)tree} $Path 2>/dev/null)"}) 

Epílogo

Hay algunos errores más en este script (por ejemplo, la lista de archivos git reset <tree-ish>se basa en <tree-ish>, cuando debería basarse en HEAD. ¡Ahora sé dónde solucionarlos!

Actualizar

También existe la posibilidad de ejecutar los scripts de finalización desde git.Puedes hacerlo siguiendo esta respuesta..

información relacionada