Sous Debian Bash nouvellement installé, après l'installation via sudo apt-get install git
, l'achèvement de git apparaît anormalement.
$ git <TAB>
^[[1;43m^[[K c^[[m^[[Kherry d^[[m^[[Kifftool h^[[m^[[Kttp-backend m^[[m^[[Kerge-file rm
a^[[m^[[Kdd c^[[m^[[Kherry-pick d^[[m^[[Kiff-tree h^[[m^[[Kttp-fetch m^[[m^[[Kerge-index shortlog
a^[[m^[[Km c^[[m^[[Klean f^[[m^[[Kast-export h^[[m^[[Kttp-push m^[[m^[[Kerge-octopus show
a^[[m^[[Knnotate c^[[m^[[Klone f^[[m^[[Kast-import i^[[m^[[Kmap-send mv show-branch
a^[[m^[[Kpply c^[[m^[[Kolumn f^[[m^[[Ketch i^[[m^[[Kndex-pack name-rev stage
a^[[m^[[Krchive c^[[m^[[Kommit f^[[m^[[Ketch-pack i^[[m^[[Knit notes stash
b^[[m^[[Kisect c^[[m^[[Kommit-tree f^[[m^[[Kilter-branch i^[[m^[[Knit-db pull status
b^[[m^[[Klame c^[[m^[[Konfig f^[[m^[[Kmt-merge-msg i^[[m^[[Knstaweb push submodule
b^[[m^[[Kranch c^[[m^[[Kount-objects f^[[m^[[Kor-each-ref l^[[m^[[Kog rebase subtree
b^[[m^[[Kundle c^[[m^[[Kredential f^[[m^[[Kormat-patch l^[[m^[[Ks-files reflog tag
c^[[m^[[Kat-file c^[[m^[[Kredential-cache f^[[m^[[Ksck l^[[m^[[Ks-remote relink verify-commit
c^[[m^[[Kheck-attr c^[[m^[[Kredential-store f^[[m^[[Ksck-objects l^[[m^[[Ks-tree remote whatchanged
c^[[m^[[Kheck-ignore d^[[m^[[Kaemon g^[[m^[[Kc mergetool repack
c^[[m^[[Kheck-mailmap d^[[m^[[Kescribe g^[[m^[[Ket-tar-commit-id m^[[m^[[Kailinfo replace
c^[[m^[[Kheckout d^[[m^[[Kiff g^[[m^[[Krep m^[[m^[[Kailsplit request-pull
c^[[m^[[Kheckout-index d^[[m^[[Kiff-files h^[[m^[[Kash-object m^[[m^[[Kerge reset
c^[[m^[[Kheck-ref-format d^[[m^[[Kiff-index h^[[m^[[Kelp m^[[m^[[Kerge-base revert
La partie est normale, comme git revert
. Mais une grande partie, comme git add
, ne peut pas être utilisée normalement car l'élément de complétion est git a^[[m^[[Kdd
.
Excusez-moi :
Qu'est-ce que c'est ^[[m^[[K
dans Bash ?
pour que la complétion de git
fonctionne normalement ?
(J'ai déjà utilisé la solution git-completion, mais elle est trop ancienne et n'a pas été mise à jour, ce qui entraîne l'absence de complétion de nouvelles fonctionnalités.)
Je le souligne encore une fois, un terminal est un terminal, et un Shell est un Shell. Il y a toujours des gens qui ne font pas la différence entre un terminal et un Shell...
Ce problème est dû à une mauvaise configuration de votre terminal. Quelle que soit la puissance de Bash, il ne peut pas gérer l'analyse du code d'échappement ANSI, tout comme vous ne pouvez pas afficher les couleurs d'un moniteur en noir et blanc si vous remplacez i3 par. i7.
Vous avez deux options :
Désactiver la coloration des complétions Git
Ajustez votre terminal pour prendre en charge le code d'échappement ANSI
Si votre émulateur de terminal prend en charge la couleur, la modifier
$TERM
résout généralement le problème. Pour des instructions plus détaillées, veuillez vous référer à http://www.tldp.org/HOWTO/Text-Terminal-HOWTO-16.html et aux liens sur cette page.est le code d'échappement ANSI.
La forme complète de^[
représente la touche ESC, et^[[
signifie ESC[
représente CSI (Control Sequence Introducer), donc^[[m^[[K
représente CSI m, CSI K. Quant à ce que signifient CSI m et CSI K, vous devez consulter le tableau.CSI m est CSI
La forme complète den
m, qui représente SGR – Select Graphic Rendition, qui est l'effet de rendu du texte dans la console. Oùn
vaut 0 pour plus de paramètres. Lorsqu'il n'y a pas de paramètres, cela devient CSI m, ce qui signifie réinitialiser l'effet de rendu par défaut. Voir ici pour plus de détails. (Le PS de la console personnalisée l'utilise également pour définir la couleur.) Par exemple, le^[[1;43m
au début de la question indique l'effet de rendu « gras ; rouge ».CSI K est CSI
n
K, ce qui signifie EL – Effacer la ligne, c'est-à-dire supprimer une partie de la ligne. Parmi eux,n
est également un paramètre Lorsquen
est 0 ou omis, il s'agit de CSI K, ce qui signifie supprimer de la position du curseur jusqu'à la fin de la ligne. Pour d'autres situations, veuillez vous référer à la description dans Wikipédia.