Les deux premiers caractères ont été répétés pendant que j'utilisais Tab faire l'achèvement. Dans la capture d'écran ci-dessous, cd
est répété.
J'ai essayé rxvt-unicdoe, xterm, terminateur. Tous ces émulateurs de terminaux ont ce problème.
Zsh version 5.0.2, fichier de configuration sur-mon-zsh
Réponse acceptée :
Si les caractères de 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 que vous vous déplacez caractère par caractère, mais devient brouillé (certains caractères apparaissant plus à droite qu'ils ne le devraient) lorsque vous utilisez d'autres commandes qui déplacent le curseur (Accueil , complétion, etc.) ou lorsque la commande chevauche une deuxième ligne.
Zsh a besoin de connaître la largeur de l'invite afin de savoir où sont placés les caractères de la commande. Il suppose que chaque personnage occupe une position, sauf indication contraire.
Il est possible que votre invite contienne des séquences d'échappement qui ne sont pas correctement délimités. 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 d'accolades en pourcentage %{…%}
. Plus généralement, une séquence d'échappement comme %42{…%}
dit à zsh de supposer que ce qui est à l'intérieur des accolades fait 42 caractères de large.
Vérifiez donc vos paramètres d'invite (PS1
, PROMPT
, ou les variables auxquelles ils font référence) et assurez-vous que toutes les séquences d'échappement (telles que \e[…m
pour modifier les attributs de texte : notez qu'il peut être présent via une variable telle que $fg[red]
) sont à l'intérieur de %{…%}
. Puisque vous utilisez oh-my-zsh, vérifiez à la fois vos propres paramètres et les définitions que vous utilisez depuis oh-my-zsh.
Le même problème se pose dans bash. Les séquences de largeur nulle dans une invite doivent être entourées de \[…\]
.
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 donnent des largeurs différentes pour certaines séquences d'octets. En règle générale, vous pouvez rencontrer ce problème lorsque vous utilisez un terminal non Unicode mais que vous déclarez une locale 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
, qui est déterminé à partir des variables d'environnement LANGUAGE
, LC_ALL
, LC_CTYPE
et LANG
(le premier d'entre eux qui est défini s'applique). La commande locale | grep LC_CTYPE
vous indique votre réglage actuel. Habituellement, la meilleure façon d'éviter les problèmes de paramètres régionaux est de laisser l'émulateur de terminal définir LC_CTYPE
, puisqu'il sait quel encodage il attend ; mais si cela ne fonctionne pas pour vous, assurez-vous de définir LC_CTYPE
.
Les mêmes symptômes peuvent se produire lorsque la commande précédente affichait une sortie qui ne se terminait pas 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 avoir exécuté une telle commande, pas de manière persistante.
Connexe :la redirection IO et la commande head ?
Si une ligne ne s'affiche pas correctement, la commande redisplay
ou clear-screen
(lié à Ctrl +L par défaut) le corrigera.