Lo estoy usando go
como un alias bash simple para git checkout branchname
. Lo que extraño es la función de autocompletar que funciona con el git checkout branchna...
comando completo , pero no en el alias.
¿Hay alguna forma de instruir a Bash para que "herede" el "controlador" de autocompletar para otro comando?
git-dir
, use esto .Respuestas:
Si puede averiguar la función de finalización utilizada por el comando original, puede asignarla al alias utilizando
complete -F
.Por ejemplo, en mi caja de ubuntu, la función de finalización utilizada por
git checkout
es_git_checkout
(que se encuentra en/etc/bash_complete.d/git
).Ejemplo
Antes de correr
complete -F
:[me@home]$ git checkout <TAB><TAB> HEAD master origin/HEAD origin/master [me@home]$ alias go="git checkout" [me@home]$$ go <TAB><TAB> .git/ precommit_config.py README.md SvnSentinel/ .gitignore precommit.py startcommit.py tests/
Después:
fuente
complete -F
no funciona para usted, vea la respuesta a__git_complete
continuación stackoverflow.com/a/24665529/3779Después de usar
complete -F
:Tabular después
go
puede resultar en:En lugar de
complete
, usa__git_complete
Esta es la función incorporada de git bash complete para este propósito.
Después de declarar su alias, vincule la función de autocompletar correcta:
alias g="git" __git_complete g _git alias go="git checkout" __git_complete go _git_checkout alias gp="git push" __git_complete gp _git_push
fuente
__git_complete
función en mi paquete de finalización de bash (instalado a través de homebrew conbrew install bash-completion
), que actualmente no se encontraba en mi perfil de bash. Tuve que agregar esta línea a ~ / .bash_profile:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
git checkout
alias funcionó de maravilla !__git_main
, no_git
. La razón que_git
existe es solo por compatibilidad con versiones anteriores, básicamente está__git_main
envuelto.En Ubuntu 16.04.3 LTS, el archivo que necesitaba obtener era
/usr/share/bash-completion/completions/git
. Entonces en.bash_custom
(o .bashrc, lo que sea):fuente
.bashrc
se leyó.En Ubuntu 18.04 (Bionic) funciona lo siguiente. Añadir algo como este fragmento (con sus alias) a su configuración preferida de fiesta de archivo, por ejemplo
.bashrc
,.bash_aliases
.bash_profile
.# define aliases alias gc='git checkout' alias gp='git pull' # setup autocompletion if [ -f "/usr/share/bash-completion/completions/git" ]; then source /usr/share/bash-completion/completions/git __git_complete gc _git_checkout __git_complete gp _git_pull else echo "Error loading git completions" fi
En general, el formato de la
__git_complete
directiva es el siguiente:Esto combina la sabiduría de las respuestas existentes en una única respuesta actualizada, gracias a todos.
fuente
echo "profile"
/echo "rc"
que lo descubrí.Para agregar a otras excelentes respuestas: normalmente tiene muchos alias de Git y puede ser tedioso reenviar manualmente las finalizaciones para todos ellos. Aquí hay un pequeño truco para hacer esto automáticamente:
if [ -f "/usr/share/bash-completion/completions/git" ]; then # Enable Git completions for aliases . /usr/share/bash-completion/completions/git for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_') if set | grep -q "^_git_$c *()"; then eval "__git_complete $a _git_$c" fi done fi
fuente
En Linux Mint, esto no funcionó para mí. Me estaba poniendo
bash: [: 1: unary operator expected
.Encontré que la siguiente respuesta funcionó bastante bien, con la sección de solución de problemas que el usuario proporcionó para ser bastante útil. /superuser/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases
fuente
Para
macOS
, ejecute lo siguiente para instalar la finalización de bashLuego agregue lo siguiente
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
a su .bashrc o .bash_profile
fuente
En Ubuntu 20.04 agrego esto a
~/.bashrc
source /usr/share/bash-completion/completions/git alias g='git' __git_complete g _git alias go='git checkout' __git_complete go _git_checkout
fuente
Como alguien más respondió, debe usar
__git_complete
, de lo contrario, el script fallará.alias g="git" __git_complete g __git_main alias g="gl" __git_complete gl _git_log
Pero no debes usarlo
_git
para el comando principal, es__git_main
.Desafortunadamente, hay mucha información oculta sobre la finalización, pero puede encontrar más en el archivo README de mi fork: git-deployment .
fuente
Me doy cuenta de que está preguntando específicamente sobre los alias de bash, pero para aquellos que vienen aquí en busca de autocompletar en bash para alias de git complejos, consulte aquí .
En particular:
# If you use complex aliases of form '!f() { ... }; f', you can use the null # command ':' as the first command in the function body to declare the desired # completion style. For example '!f() { : git commit ; ... }; f' will # tell the completion to use commit completion. This also works with aliases # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
fuente