Si les caractères sur votre ligne de commande sont parfois affichés avec un décalage, c'est souvent parce que zsh a calculé la mauvaise largeur pour l'invite. Les symptômes sont que l'affichage semble correct tant que vous ajoutez des caractères ou déplacez caractère par caractère, mais devient tronqué (certains caractères apparaissant plus à droite qu'ils ne le devraient) lorsque vous utilisez d'autres commandes qui déplacent le curseur ( Home, achèvement, etc. ) ou lorsque la commande chevauche une deuxième ligne.
Zsh doit connaître la largeur de l' invite pour savoir où sont placés les caractères de la commande. Il suppose que chaque personnage occupe une position, sauf indication contraire.
Une possibilité est que votre invite contienne des séquences d'échappement qui ne sont pas correctement délimitées. Les séquences d'échappement qui modifient la couleur ou d'autres aspects de mise en forme du texte, ou qui modifient le titre de la fenêtre ou d'autres effets, ont une largeur nulle. Ils doivent être inclus dans une construction à accolades en pourcentage%{…%}
. Plus généralement, une séquence d'échappement comme %42{…%}
dit à zsh de supposer que ce qui se trouve à l'intérieur des accolades fait 42 caractères de large.
Vérifiez donc vos paramètres rapides ( PS1
, PROMPT
ou les variables auxquels ils font référence) et assurez - vous que toutes les séquences d'échappement ( par exemple \e[…m
au texte de modifier les attributs - Notez qu'il peut être présent via une variable comme $fg[red]
) sont à l' intérieur %{…%}
. Puisque vous utilisez oh-my-zsh, vérifiez à la fois vos propres paramètres et les définitions que vous utilisez de oh-my-zsh.
Le même problème se pose dans bash. Il faut y inclure des séquences de largeur nulle dans une invite\[…\]
.
Une autre possibilité est que votre invite contienne des caractères non ASCII et que zsh (ou toute autre application) et votre terminal aient une idée différente de leur largeur. Cela peut se produire s'il y a une incompatibilité entre l'encodage de votre terminal et l'encodage déclaré dans le shell, et les deux encodages entraînent des largeurs différentes pour certaines séquences d'octets. En règle générale, vous pouvez rencontrer ce problème lors de l'utilisation d'un terminal non Unicode mais en déclarant un environnement local Unicode ou vice versa.
Les applications s'appuient sur des variables d'environnement pour connaître les paramètres régionaux; le paramètre pertinent est LC_CTYPE
, ce qui est déterminé à partir des variables d'environnement LANGUAGE
, LC_ALL
, LC_CTYPE
et LANG
(le premier de ceux - ci qui est mis en applique). La commande locale | grep LC_CTYPE
vous indique votre paramètre actuel. Habituellement, le meilleur moyen d'éviter les problèmes de localisation est de laisser l'émulateur de terminal défini LC_CTYPE
, car il sait quel codage il attend; mais si cela ne fonctionne pas pour vous, assurez-vous de régler LC_CTYPE
.
Les mêmes symptômes peuvent se produire lorsque la commande précédente a affiché une sortie qui ne s'est pas terminée par une nouvelle ligne, de sorte que l'invite s'affiche au milieu de la ligne mais que le shell ne s'en rend pas compte. Dans ce cas, cela ne se produirait qu'après l'exécution d'une telle commande, pas de manière persistante.
Si une ligne ne s'affiche pas correctement, la commande redisplay
ou clear-screen
(liée à Ctrl+ Lpar défaut) la corrigera.