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_complete
función en git-completar.bash que se puede usar para configurar la finalización de alias de esta manera:fuente
__git_complete g __git_main
para que el código complete en todos los comandos de git.git-completion.bash
de<your git install folder>/etc/bash-completion.d/
al~/.git-completion.bash
paso 2) añadirsource ~/.git-completion.bash
a su.bash_profile
paso 3) Añadir__git_complete gco _git_checkout
en 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_arguments
no funcionó en Mac OS X por alguna razón. Sin embargo, reemplazarlo con((COMP_CWORD+=$num_alias_arguments))
arregladowrap_alias
se 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 enecho
lugar deeval
y canalizar la salida en un archivo de caché (que luego se puedeeval
editar de una vez) funciona bien y es súper rápido .wrap_alias
requiere que se completen las terminaciones, por lo que tuve que movermesource /etc/bash_completion
delante delwrap_alias
código.let COMP_CWORD+=$num_alias_arguments
alet \"COMP_CWORD+=$num_alias_arguments\"
.En
git-completion.bash
hay 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-completion
o esa línea/etc/bash_completion.d/git
, pero agreguécomplete -o default -o nospace -F _git g
después de mi alias.bash_aliases
y 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
~/.gitconfig
archivo, 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 checkout
comando.fuente
Esta página del foro muestra una solución.
Pon estas líneas en tu
.bashrc
o.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 lafunction
cadena 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_completion
archivo. Para crear elgco
alias paragit checkout
simplemente poner esto allí:Luego
~/.bashrc
, debe poner solo el alias:Dos lineas. Eso es.
Explicación:
Se
~/bash_completion
obtiene al final del script principal bash_completion. En gentoo encontré el guión principal en/usr/share/bash-completion/bash_completion
.El
_xfunc git
bit se encarga de obtener elgit-completion
archivo por usted para que no necesite agregar nada más~/.bashrc
.La respuesta aceptada requiere que la copie
.git-completion.sh
y la obtenga de su~/.bashrc
archivo, lo que me parece poco convincente.PD: Todavía estoy tratando de descubrir cómo no generar el
git-completion
script completo en mi entorno bash. Comenta o edita si encuentras la manera.fuente
_xfunc git
requiere?source ~/.git-completion.sh
, dejo_xfunc
hacerlo por mí. Simplemente se siente mejor y más limpio hacerlo solo en~/.bash_completion
. Sin el_xfunc
(o el abastecimiento) la__git_complete
función no existe.~/.bash_completion
archivo, la_xfunc
línea me funciona.bashrc
.Solo tiene que encontrar el
complete
comando y duplicar la línea que tiene el nombre de alias.Tengo
alias d-m="docker-machine"
. En palabras,d-m
será 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
docker
aliasd
. Aunque para el ejemplo en la pregunta,git checkout
alias agco
es 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_loader
lí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 presionarTAB
la 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=git
sino que lo heg
definido 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 git
en 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_aliases
fuente