¿Cómo alias 'git' a 'g' para preservar las reglas de finalización de bash?

25

Si hago esto:

alias g='git'

Pierdo todas las reglas de finalización (es decir, las ramas y los controles remotos ya no se completan automáticamente cuando presiono TAB después de escribir, por ejemplo g push o).

Paweł Gościcki
fuente
Si bien no tengo una respuesta para usted, tendré que tomarme un minuto y preguntarme si no escribir esas otras dos letras realmente le da una gran ventaja.
Marco Ceppi
44
Claro que si! Estoy escribiendo 'g' probablemente más de 100 veces al día.
Paweł Gościcki
3
Aliasing comandos cortos de uso frecuente a alias aún más cortos me ahorra cientos de pulsaciones de teclas al día. De acuerdo con mi historial de shell, he usado el alias g=git756 veces en el último mes, lo que significa que guardé presionando las teclas 'g' e 'i' 1512 veces en total. Eso, combinado con mis alias git, probablemente me ahorre decenas de miles de pulsaciones de teclas al mes.
El punto principal de acortar las pulsaciones de teclas es ayudar a tus manos a seguir el ritmo de tu cerebro.
Tyler Collier
El script en superuser.com/questions/436314/… funcionó tan bien que creo que merece una mención.
brandizzi

Respuestas:

21

Copie y modifique oportunamente desde /etc/bash_completion.d/git, agregue las siguientes líneas a su ~/.bashrc:

complete -o bashdefault -o default -o nospace -F _git g 2>/dev/null \
    || complete -o default -o nospace -F _git g
enzotib
fuente
¡Decir ah! Wunderbar! Funciona como debería :)
Paweł Gościcki
1
También tuve que agregar source /usr/share/bash-completion/completions/gita mi .bashrc
pcx
No estoy seguro si el .bashrccódigo aquí funciona, pero esta respuesta definitivamente está desactualizada. /etc/bash_completion.d/gitno parece existir el 14.04. Ver la respuesta de lzap a continuación.
Max Wallace el
18

La última secuencia de finalización de bash se movió y cambió el nombre de las cosas un poco. Nieva:

source /usr/share/bash-completion/completions/git
__git_complete g __git_main

Use esto en versiones recientes de Ubuntu (por ejemplo, 14.04, también Fedora 22+) cuando encuentre:

completion: function `_git' not found

durante completar

lzap
fuente
2
Parece que esta es la única respuesta correcta aquí.
pjvandehaar
Use __git_complete gc _git_checkout(o similar) para configurar terminaciones para alias más específicos. Busque /usr/.../gitcomo arriba para encontrar el nombre correcto.
Max Wallace el
1
@MaxWallace: cuando configura los alias para métodos git particulares en .gitconfig (por ejemplo, gc = checkout), no es necesario configurarlos para que se completen explícitamente.
Piotr Aleksander Chmielowski
1
@PiotrAleksanderChmielowski ¡Gracias! Pero no creo que funcione para los alias de bash de nivel superior (por ejemplo gc=> git checkout) en lugar de aliasing ca checkoutdentro git, y diciendo git c. Corrígeme si me equivoco.
Max Wallace
@MaxWallace Sí, tienes razón, mi error;)
Piotr Aleksander Chmielowski
2

Primero, busque el comando de finalización original. Ejemplo:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

Ahora agréguelos a su script de inicio (por ejemplo, ~ / .bashrc):

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

# load dynamically loaded completion functions (may not be required)
_completion_loader git

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 presionar TABla primera vez. Entonces, si no ha utilizado el comando original y prueba el alias + TAB, puede recibir un error como "bash: complete: function not found".

wisbucky
fuente
Funciona genial. Para mí esta es la respuesta correcta, el comando grep en complete es útil. No necesitaba el cargador de finalización.
Paul Carlton
1

La forma actualizada de hacer esto (completa no funcionaría para mí):

  1. cd - cambie a su directorio de inicio
  2. wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
  3. Agregue source ~/git-completion.basha su archivo .bashrc (si no tiene este archivo, cree uno en su carpeta de inicio, bash lo buscará automáticamente)
  4. Añadir alias g='git'a su archivo .bashrc.
  5. Comience una nueva sesión o obtenga sus cambios con source ~/.bashrc
Elijah Lynn
fuente
2
Omitió la parte en la que realmente agregaron finalización en el comentario al que se vinculó:__git_complete g _git
pjvandehaar
0

Solo por completar, me gustaría agregar una respuesta usando el ~/.bash-completionarchivo, que se obtiene al final del script de finalización de bash:

_xfunc git __git_complete g __git_main
_xfunc git __git_complete gl _git_log
_xfunc git __git_complete gd _git_diff
_xfunc git __git_complete gb _git_branch

Entonces en mi ~/.bashrcsolo tengo los alias. Estaba intentando:

  • evite contaminar mi ~/.bashrccon cosas de finalización de bash (mantenga las cosas donde corresponde) ✓
  • evite abastecer todo el git-complete en mi shell ☹

Desafortunadamente, las _xfuncfuentes de git-complete de todos modos. Actualizaré esta respuesta una vez que descubra cómo hacerlo correctamente (también pregunté aquí en lunchpad ).

kub1x
fuente
-1

Mira aquí: https://gist.github.com/scue/576310b7c6b7714aad05

wget https://gist.github.com/scue/576310b7c6b7714aad05/raw/459d46761c231f5c373c1cf496920b01bb6669d2/.bash_aliases.git -O ~/.bash_aliases.git
echo "test -e ~/.bash_aliases.git && source ~/.bash_aliases.git" >> ~/.bashrc

¡Disfruta! (^ O ^) /

scue
fuente
1
Lo siento, pero eso es algo completamente diferente. Hacer tales alias simples para comandos completos es trivial.
Paweł Gościcki
Solo los hago funcionar como el complemento git de Oh-My-Zsh: github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/…
scue
-1

Puede definir alias como de costumbre:

alias g='git'

Luego instale complete-alias para hacer que bash complete el alias.

Cyker
fuente