Die ersten beiden Zeichen wurden wiederholt, während ich Tab verwende Abschluss zu tun. Im Screenshot unten cd
wird wiederholt.
Ich habe rxvt-unicdoe, xterm, terminator ausprobiert. Alle diese Terminalemulatoren haben dieses Problem.
Zsh Version 5.0.2, Konfigurationsdatei on-my-zsh
Akzeptierte Antwort:
Wenn die Zeichen auf Ihrer Befehlszeile manchmal versetzt angezeigt werden, liegt dies häufig daran, dass zsh die falsche Breite für die Eingabeaufforderung berechnet hat. Die Symptome sind, dass die Anzeige gut aussieht, solange Sie Zeichen hinzufügen oder Zeichen für Zeichen verschieben, aber verstümmelt wird (wobei einige Zeichen weiter rechts erscheinen, als sie sollten), wenn Sie andere Befehle verwenden, die den Cursor bewegen (Home , Vervollständigung usw.) oder wenn der Befehl eine zweite Zeile überlappt.
Zsh muss die Breite der Eingabeaufforderung kennen, um zu wissen, wo die Zeichen des Befehls platziert werden. Es wird davon ausgegangen, dass jedes Zeichen eine Position einnimmt, sofern nicht anders angegeben.
Eine Möglichkeit ist, dass Ihre Eingabeaufforderung Escape-Sequenzen enthält die nicht richtig abgegrenzt sind. Escape-Sequenzen, die die Farbe oder andere Formatierungsaspekte des Textes oder den Fenstertitel oder andere Effekte ändern, haben eine Breite von Null. Sie müssen in ein Prozent-Klammern-Konstrukt eingeschlossen werden %{…%}
. Allgemeiner eine Escape-Sequenz wie %42{…%}
weist zsh an, davon auszugehen, dass das, was innerhalb der geschweiften Klammern steht, 42 Zeichen breit ist.
Überprüfen Sie also Ihre Eingabeaufforderungseinstellungen (PS1
, PROMPT
, oder die Variablen, auf die sie verweisen) und stellen Sie sicher, dass alle Escape-Sequenzen (wie \e[…m
um Textattribute zu ändern – beachten Sie, dass es über eine Variable wie $fg[red]
vorhanden sein kann ) befinden sich innerhalb von %{…%}
. Da Sie oh-my-zsh verwenden, überprüfen Sie sowohl Ihre eigenen Einstellungen als auch die Definitionen, die Sie von oh-my-zsh verwenden.
Das gleiche Problem tritt in bash auf. Dort müssen Sequenzen mit Nullbreite in einer Eingabeaufforderung in \[…\]
eingeschlossen werden .
Eine andere Möglichkeit besteht darin, dass Ihre Eingabeaufforderung Nicht-ASCII-Zeichen enthält und dass zsh (oder eine andere Anwendung) und Ihr Terminal eine andere Vorstellung davon haben, wie breit sie sind. Dies kann passieren, wenn die Codierung nicht übereinstimmt Ihres Terminals und der in der Shell deklarierten Codierung, und die beiden Codierungen führen zu unterschiedlichen Breiten für bestimmte Bytefolgen. Typischerweise könnten Sie auf dieses Problem stoßen, wenn Sie ein Nicht-Unicode-Terminal verwenden, aber ein Unicode-Gebietsschema deklarieren oder umgekehrt.
Anwendungen verlassen sich auf Umgebungsvariablen, um das Gebietsschema zu kennen; die relevante Einstellung ist LC_CTYPE
, die aus den Umgebungsvariablen LANGUAGE
ermittelt wird , LC_ALL
, LC_CTYPE
und LANG
(der zuerst gesetzte gilt). Der Befehl locale | grep LC_CTYPE
teilt Ihnen Ihre aktuelle Einstellung mit. Normalerweise lässt sich der Terminal-Emulator am besten LC_CTYPE
festlegen, um lokale Probleme zu vermeiden , da es weiß, welche Codierung es erwartet; aber wenn das bei dir nicht funktioniert, stelle sicher, dass du LC_CTYPE
einstellst .
Die gleichen Symptome können auftreten, wenn der vorherige Befehl eine Ausgabe anzeigte, die nicht mit einem Zeilenumbruch endete, sodass die Eingabeaufforderung in der Mitte der Zeile angezeigt wird, die Shell dies jedoch nicht erkennt. In diesem Fall würde das nur nach Ausführung eines solchen Befehls passieren, nicht dauerhaft.
Verwandte:IO-Umleitung und der Head-Befehl?
Wenn eine Zeile nicht richtig angezeigt wird, kann der Befehl redisplay
oder clear-screen
(gebunden an Strg +L standardmäßig) wird es beheben.