Caso en punto:
Estoy en Mac con bash v3.2.17, estoy usando git instalado a través de macports con la variante bash_completion.
Cuando escribo git checkout m<tab>. por ejemplo, lo completo a master.
Sin embargo, tengo un alias git checkout, gco. Cuando escribo gco m<tab>, no se completa automáticamente el nombre de la sucursal.
Idealmente, me gustaría que el autocompletado funcione mágicamente para todos mis alias. ¿Es posible? De lo contrario, me gustaría personalizarlo manualmente para cada alias. Entonces, ¿cómo hago?

Respuestas:
Como se indicó en los comentarios anteriores,
Ya no funcionará. Sin embargo, hay una
__git_completefunción en git-completar.bash que se puede usar para configurar la finalización de alias de esta manera:fuente
__git_complete g __git_mainpara que el código complete en todos los comandos de git.git-completion.bashde<your git install folder>/etc/bash-completion.d/al~/.git-completion.bashpaso 2) añadirsource ~/.git-completion.basha su.bash_profilepaso 3) Añadir__git_complete gco _git_checkouten cualquier lugar después de la línea anterior en su .bash_profile. Paso 4) ¡Reinicia el shell y disfruta de tu autocompletado de alias! :)Me encontré con este problema también y se me ocurrió este fragmento de código. Esto le dará automáticamente la finalización de todos los alias. Ejecútelo después de declarar todo (o cualquier) alias.
fuente
let COMP_CWORD+=$num_alias_argumentsno funcionó en Mac OS X por alguna razón. Sin embargo, reemplazarlo con((COMP_CWORD+=$num_alias_arguments))arregladowrap_aliasse ahoga con comillas dobles en la definición de alias, y supongo que no tiene mucho sentido para los alias de comandos múltiples (alias 'foo=bar; baz'), así que pongo un extra| grep -v '[";|&]'después dealias -p. Además, se vuelve un poco lento para cientos de definiciones de alias, pero estoy feliz de confirmar que usar enecholugar deevaly canalizar la salida en un archivo de caché (que luego se puedeevaleditar de una vez) funciona bien y es súper rápido .wrap_aliasrequiere que se completen las terminaciones, por lo que tuve que movermesource /etc/bash_completiondelante delwrap_aliascódigo.let COMP_CWORD+=$num_alias_argumentsalet \"COMP_CWORD+=$num_alias_arguments\".En
git-completion.bashhay una línea:Mirando esa línea (y la función _git) puede agregar esta línea a su
.bash_profile:fuente
He alias g = 'git', y combinado con mis alias git escribo cosas como
La solución más simple para mi caso de uso específico fue agregar una sola línea para completar git.
Justo debajo de esta línea:
Agregué esta línea para manejar mi solo alias 'g':
fuente
git-completiono esa línea/etc/bash_completion.d/git, pero agreguécomplete -o default -o nospace -F _git gdespués de mi alias.bash_aliasesy funcionó./etc/bash-completion.d/o recientemente/usr/share/bash-completion/, perderá sus cambios cada vez que ese archivo se actualice utilizando su administrador de paquetes.Sí, es posible con el proyecto de alias completo (en Linux). El soporte para Mac es experimental, pero los usuarios han informado de éxito.
fuente
También podría intentar usar alias Git. Por ejemplo, en mi
~/.gitconfigarchivo, tengo una sección que se ve así:Entonces podría escribir
git co m<TAB>, y eso debería expandirse agit co master, que es elgit checkoutcomando.fuente
Esta página del foro muestra una solución.
Pon estas líneas en tu
.bashrco.bash_profile:Esta solución es similar al script de balshetzer , pero solo esta realmente funciona para mí. (El guión de balshetzer tuvo problemas con algunos de mis alias).
fuente
-bash: eval: line 28: unexpected EOF while looking for matching '''-bash: eval: line 29: syntax error: unexpected end of file"citas arriba ... las comillas dentro de lafunctioncadena deben ser citadas como\". Esto probablemente se come una de sus'citas en algún lugar a lo largo de la línea.Una opción más es usar el
~/.bash_completionarchivo. Para crear elgcoalias paragit checkoutsimplemente poner esto allí:Luego
~/.bashrc, debe poner solo el alias:Dos lineas. Eso es.
Explicación:
Se
~/bash_completionobtiene al final del script principal bash_completion. En gentoo encontré el guión principal en/usr/share/bash-completion/bash_completion.El
_xfunc gitbit se encarga de obtener elgit-completionarchivo por usted para que no necesite agregar nada más~/.bashrc.La respuesta aceptada requiere que la copie
.git-completion.shy la obtenga de su~/.bashrcarchivo, lo que me parece poco convincente.PD: Todavía estoy tratando de descubrir cómo no generar el
git-completionscript completo en mi entorno bash. Comenta o edita si encuentras la manera.fuente
_xfunc gitrequiere?source ~/.git-completion.sh, dejo_xfunchacerlo por mí. Simplemente se siente mejor y más limpio hacerlo solo en~/.bash_completion. Sin el_xfunc(o el abastecimiento) la__git_completefunción no existe.~/.bash_completionarchivo, la_xfunclínea me funciona.bashrc.Solo tiene que encontrar el
completecomando y duplicar la línea que tiene el nombre de alias.Tengo
alias d-m="docker-machine". En palabras,d-mserá el alias paradocker-machine.Entonces, en Mac (a través de brew), los archivos de finalización están en
cd `brew --prefix`/etc/bash_completion.d/.Para mi caso, edité el archivo llamado
docker-machine.Todo el camino al fondo había:
Así que acabo de agregar otra línea, con mi alias:
fuente
dockeraliasd. Aunque para el ejemplo en la pregunta,git checkoutalias agcoes más complejo.Primero, busque el comando de finalización original. Ejemplo:
Ahora agréguelos a su script de inicio (por ejemplo, ~ / .bashrc):
La
_completion_loaderlínea puede no ser requerida. Pero para algunas situaciones, la función de finalización solo se carga dinámicamente después de escribir el comando y presionarTABla primera vez. Por lo tanto, si no ha utilizado el comando original y prueba el alias +TAB, puede obtener un error como "bash: complete: function '_docker' not found".fuente
Hay muchas respuestas a esta pregunta y, como yo, apuesto a muchos lectores confundidos. Para mi caso, también tuve el requisito de que mis archivos dot funcionaran en múltiples plataformas con diferentes versiones de Git. Tampoco lo hago,
alias g=gitsino que lo hegdefinido como una funciónPara lograr esto, tuve que juntar diferentes respuestas aquí en una sola solución. Aunque esto ya reitera las respuestas, pensé que alguien en mi bote podría encontrar esta compilación útil como lo habría hecho cuando llegué a esta pregunta.
Esto supone la finalización de Git más antigua y más reciente, los valores predeterminados de Ubuntu y
brew install giten MacOS. En el último caso, las terminaciones instaladas en brew no estaban siendo procesadas por bash (algo que diagnosticaré más adelante).fuente
Si usa
alias g='git', agrego esta línea de código en.bash_aliasesfuente