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.
- establecido
compdef -d git
en .zshrccomo lo propone "cavernícola"- Resuelve: Ahora HEAD^ ya no interrumpe el autocompletado de archivos.
- Desventaja: el autocompletado del comando git ya no funciona.
- 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.zsh
o 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_files
parece sospechoso.
En la línea 6058 en /usr/local/share/zsh/functions/_git
encontramos
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 $tree
variable. 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..