Les premiers caractères de la commande sont répétés à l'écran à la fin


21

Les deux premiers caractères ont été répétés pendant que j'utilise Tabpour terminer. Dans la capture d'écran ci-dessous, cdest répété.

entrez la description de l'image ici

J'ai essayé rxvt-unicdoe, xterm, terminator. Tous ces émulateurs de terminaux ont ce problème.

Zsh version 5.0.2, fichier de configuration on-my-zsh


Les caractères sont-ils répétés dans la commande exécutée par zsh ou sont-ils simplement affichés? Le nombre de caractères change-t-il si la commande dépasse deux caractères? Le numéro change-t-il lorsque le répertoire actuel change?
Gilles 'SO- arrête d'être méchant'

@Gilles Le caractère répété n'existe pas dans la commande. Je peux exécuter la commande.
jilen

Réponses:


32

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, PROMPTou les variables auxquels ils font référence) et assurez - vous que toutes les séquences d'échappement ( par exemple \e[…mau 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_CTYPEet LANG(le premier de ceux - ci qui est mis en applique). La commande locale | grep LC_CTYPEvous 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 redisplayou clear-screen(liée à Ctrl+ Lpar défaut) la corrigera.


Je suppose qu'il me manque probablement une police associée, je remarque que le premier caractère est étrange. On s'attend à ->ce que ce soit
jilen

@jilen Ah, cela pourrait être un autre problème que j'ai oublié de mentionner: peut-être que votre invite contient des caractères non ASCII dans un encodage différent de votre terminal, avec un ou les deux encodages étant multi-octets. Si vous voulez de l'aide, affichez la sortie de localeet de echo $PS1 | od -t x1(et la même chose avec toute autre variable utilisée par $PS1).
Gilles 'SO- arrête d'être méchant'

2
J'ai oublié de définir les paramètres régionaux (j'utilise archlinux, les paramètres régionaux ne sont pas définis par défaut). Après avoir défini les paramètres régionaux, ce problème est résolu. Merci beaucoup, mec !!!!
jilen

Je l'ai voté parce que, eh bien, c'est assez génial. Mais les échappements ne doivent pas absolument être inclus dans les crochets si vous gérez autrement le nombre de curseurs par vous-même. appeler une fonction sous-shell a fonctionné pour moi dans le passé - ou des redirections qui atterrissent toujours sur / dev / tty sans impliquer stdout pourraient fonctionner. Autres méthodes qui ont fonctionné - utiliser \e{7,8}pour enregistrer / restaurer les états du curseur.
mikeserv

C'est le LC_CTYPEproblème qui l'a réparé pour moi. Je l'avais réglé sur C, quand je l'ai désarmé, tout a fonctionné. Merci.
jmaloney


1

J'ai eu ce problème dans iTerm 2 sur macOS. J'ai fini par le résoudre en allant dans Préférences -> Profils -> Texte et en cochant "Utiliser les largeurs Unicode version 9".


Wow, cela a vraiment fonctionné. Merci!
Paul Calabro

1

J'ai ce problème en utilisant ubuntu lts docker image ( ubuntu:latest). Je l'ai corrigé avec les instructions fournies sur la page correspondante: https://hub.docker.com/_/ubuntu

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.