Como alias 'git' a 'g' para que as regras de conclusão do bash sejam preservadas?

25

Se eu fizer isso:

alias g='git'

Perco todas as regras de conclusão (ou seja, ramificações e controles remotos não estão mais sendo concluídos automaticamente quando clico em TAB após digitar, por exemplo g push o).

Paweł Gościcki
fonte
Embora eu não tenha uma resposta para você, vou ter que esperar um minuto e me perguntar se não digitar essas duas outras letras está realmente lhe dando uma grande vantagem.
Marco Ceppi
4
Claro que sim! Estou digitando 'g' provavelmente mais de 100 vezes por dia.
Paweł Gościcki
3
Aliasing comandos curtos frequentemente usados ​​para aliases ainda mais curtos me poupa centenas de pressionamentos de tecla por dia. De acordo com meu histórico de shell, usei o alias g=git756 vezes no mês passado, o que significa que salvei pressionando as teclas 'g' e 'i' 1512 vezes no total. Isso, combinado com meus apelidos git, provavelmente me salva dezenas de milhares de pressionamentos de tecla por mês.
O ponto principal de diminuir as teclas digitadas é ajudar as mãos a acompanhar o cérebro.
Tyler Collier
O script em superuser.com/questions/436314/… funcionou tão bem que acho que merece uma menção.
26616 Brandizzi

Respostas:

21

Copiando e modificando oportunamente de /etc/bash_completion.d/git, adicione as seguintes linhas ao seu ~/.bashrc:

complete -o bashdefault -o default -o nospace -F _git g 2>/dev/null \
    || complete -o default -o nospace -F _git g
enzotib
fonte
Ha! Wunderbar! Funciona como deveria :)
Paweł Gościcki
1
Eu também tive que adicionar source /usr/share/bash-completion/completions/gitao meu .bashrc
pcx
Não tenho certeza se o .bashrccódigo aqui funciona, mas esta resposta está definitivamente desatualizada. /etc/bash_completion.d/gitparece não existir em 14.04. Veja a resposta do lzap abaixo.
Max Wallace
18

A última conclusão do bash-upstream mudou e renomeou as coisas um pouco. É neve:

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

Use isso nas versões recentes do Ubuntu (por exemplo, 14.04, também Fedora 22+) quando você encontrar:

completion: function `_git' not found

durante a conclusão.

lzap
fonte
2
Parece que esta é a única resposta correta aqui.
Pjvandehaar #
Use __git_complete gc _git_checkout(ou similar) para configurar conclusões para aliases mais específicos. Pesquise /usr/.../gitcomo acima para encontrar o nome certo.
Max Wallace
1
@ MaxWallace - quando você define os aliases para métodos git específicos em .gitconfig (por exemplo, gc = checkout), não é necessário configurar explicitamente a conclusão para eles.
Piotr Aleksander Chmielowski 22/10
1
@PiotrAleksanderChmielowski Thanks! Mas não acho que isso funcione para aliases de bash de nível superior (por exemplo, gc=> git checkout), em vez de aliasing cpara checkoutdentro gite para dizer git c. Corrija-me se eu estiver errado.
Max Wallace
@MaxWallace Sim, você está certo, meu erro;) #
Piotr Aleksander Chmielowski
2

Primeiro, procure o comando de conclusão original. Exemplo:

$ complete | grep git

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

Agora adicione-os ao seu script de inicialização (por exemplo, ~ / .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

A _completion_loaderlinha pode não ser necessária. Mas, em algumas situações, a função de conclusão é carregada dinamicamente somente depois que você digita o comando e pressiona TABpela primeira vez. Portanto, se você não tiver usado o comando original e tentar o alias + TAB, poderá receber um erro como "bash: conclusão: função não encontrada".

wisbucky
fonte
Funciona bem. Para mim, esta é a resposta correta, o comando grep em complete é útil. Não precisava do carregador de conclusão.
Paul Carlton
1

A maneira atualizada de fazer isso (completo não funcionaria para mim):

  1. cd - mude para o seu diretório pessoal
  2. wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
  3. Adicione source ~/git-completion.bashao seu arquivo .bashrc (se você não tiver esse arquivo, crie um na sua pasta pessoal, o bash o procurará automaticamente)
  4. Adicione alias g='git'ao seu arquivo .bashrc.
  5. Inicie uma nova sessão ou forneça suas alterações com source ~/.bashrc
Elijah Lynn
fonte
2
Você pulou a parte onde eles realmente adicionado conclusão no comentário é ligada ao:__git_complete g _git
pjvandehaar
0

Por uma questão de integridade, gostaria de adicionar uma resposta usando o ~/.bash-completion arquivo, que é obtido no final do script de conclusão do 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

Então na minha ~/.bashrc eu tenho apenas os pseudônimos. Eu estava tentando:

  • evite poluir o meu ~/.bashrccom o material de conclusão do bash (mantenha o material onde ele pertence) ✓
  • evite colocar toda a conclusão do git no meu shell ☹

De qualquer maneira, as _xfuncfontes não concluem a conclusão do git. Atualizarei esta resposta assim que descobrir como fazê-lo corretamente (também perguntei no lunchpad aqui ).

kub1x
fonte
-1

Veja aqui: 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

Aproveite! (^ O ^) /

scue
fonte
1
Desculpe, mas isso é algo completamente diferente. Criar alias simples para comandos inteiros é trivial.
Paweł Gościcki 15/05
Eu apenas os faço funcionar como o plugin git do Oh-My-Zsh: github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/…
scue
-1

Você pode apenas definir aliases como de costume:

alias g='git'

Em seguida, instale o alias completo para tornar o reconhecimento do alias da conclusão do bash.

Cyker
fonte