96 votes

Git autocomplete dans les alias bash ?

J'utilise go comme un simple alias bash pour git checkout branchname . Ce qui me manque, c'est la fonction d'autocomplétion qui fonctionne avec la version complète de l'application. git checkout branchna... mais pas dans l'alias.

Existe-t-il un moyen de demander à Bash d'"hériter" du "pilote" d'autocomplétion d'une autre commande ?

1 votes

0 votes

0 votes

Related : si l'alias définit un git-dir puis utiliser ce .

128voto

theprogrammerin Points 21

Après avoir utilisé complete -F :

complete -F _git_checkout go

Tabulation après go peut entraîner :

bash: [: 1: unary operator expected

Au lieu de complete utiliser __git_complete

Il s'agit de la fonction intégrée de la complétion de git bash à cette fin.

Après avoir déclaré votre alias, liez-lui la bonne fonction de complétion automatique :

# Main git completions (prior to git 2.30, you an use _git instead of __git_main)
alias g="git"
__git_complete g __git_main

alias go="git checkout"
__git_complete go _git_checkout

alias gp="git push"
__git_complete gp _git_push

5 votes

@LuuVinhPhúc J'avais le même problème. C'est parce que j'avais le __git_complete dans mon paquetage de complétion bash (installé via homebrew avec brew install bash-completion ), qui n'était pas actuellement sourcé dans mon profil bash. J'ai dû ajouter cette ligne à ~/.bash_profile : [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion

1 votes

Ajout de __git_complete sous git checkout L'alias a fonctionné comme un charme ! !!

2 votes

Il devrait être __git_main pas _git . La raison _git existe uniquement pour la rétrocompatibilité, c'est essentiellement __git_main enveloppé.

46voto

Shawn Chin Points 29756

Si vous pouvez trouver la fonction d'achèvement utilisée par la commande originale, vous pouvez l'assigner à l'alias en utilisant complete -F .

Par exemple, sur ma boîte ubuntu, la fonction de complétion utilisée par git checkout est _git_checkout (trouvé dans /etc/bash_complete.d/git ).

Ejemplo

Avant de courir 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/ 

Après :

[me@home]$$ complete -F _git_checkout go

[me@home]$$ go <TAB><TAB>
HEAD            master          origin/HEAD     origin/master

1 votes

Sur ubuntu 12.04 les complétions semblent vivre dans : /etc/bash_completion.d/git et non /etc/bash_complete.d/git

9 votes

Si complete -F ne fonctionne pas pour vous, consultez la réponse sur __git_complete en dessous de stackoverflow.com/a/24665529/3779

26voto

adamnfish Points 2444

Sur Ubuntu 18.04 (Bionic), ce qui suit fonctionne. Ajoutez quelque chose comme ce bout de phrase (avec vos alias) à votre fichier de configuration bash préféré, par ex. .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 général, le format de l __git_complete est la suivante :

__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>

Cela combine la sagesse des réponses existantes en une seule réponse actualisée, merci à tous.

0 votes

Je voudrais juste ajouter que pour une session ssh/terminal uniquement, mettez tout dans .bashrc. J'avais le truc complet de git dans .bash_profile et les alias dans .bashrc et je n'arrivais pas à le faire fonctionner. Ce n'est que lorsque j'ai ajouté un echo "profile" / echo "rc" que j'ai compris ça.

2 votes

Fonctionne toujours le 20 août 2021 dans Ubuntu 20.04

0 votes

Pourquoi n'est-ce pas la réponse numéro un ? C'est un exemple complet qui montre d'où vient __git_complete...

19voto

SeamusJ Points 381

Dans Ubuntu 16.04.3 LTS, le fichier dont j'avais besoin était le suivant /usr/share/bash-completion/completions/git . Donc en .bash_custom (ou .bashrc, peu importe) :

[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main

1 votes

La raison pour laquelle le chargement manuel est nécessaire est qu'actuellement Bash charge ces fichiers de manière dynamique. Jusqu'à présent, il les charge en fonction de leur nom. Le fichier ne sera pas chargé tant que vous n'aurez pas obtenu l'achèvement de la commande Git, ce qui est trop tard pour que la commande .bashrc a été lu.

4voto

felipec Points 3278

Comme quelqu'un d'autre l'a répondu, vous devriez utiliser __git_complete sinon le script échouera.

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

Mais vous ne devriez pas utiliser _git pour la commande principale, c'est __git_main .

Malheureusement, beaucoup d'informations sur l'achèvement sont cachées, mais vous pouvez en trouver plus sur le README de mon fork : git-complétion .

0 votes

J'utilisais _git qui a été supprimée dans Git 2.30, ce qui a brisé mon achèvement. Cela fonctionne ; merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X