Wenn die Zeichen in 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 bei Verwendung anderer Befehle, 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 sind. Es wird davon ausgegangen, dass jeder Charakter eine Position einnimmt, sofern nicht anders angegeben.
Eine Möglichkeit besteht darin, dass Ihre Eingabeaufforderung Escape-Sequenzen enthält , die nicht richtig abgegrenzt sind. Escape-Sequenzen, die die Farbe oder andere Formatierungsaspekte des Texts ändern oder den Fenstertitel oder andere Effekte ändern, haben die Breite Null. Sie müssen in ein Prozent-Klammer-Konstrukt eingeschlossen werden%{…%}
. Allgemeiner %42{…%}
gesagt, sagt eine Escape-Sequenz wie zsh, dass das, was sich in den geschweiften Klammern befindet, 42 Zeichen breit ist.
Überprüfen Sie daher Ihre Eingabeaufforderungseinstellungen ( PS1
, PROMPT
oder die Variablen, auf die sie verweisen) und stellen Sie sicher, dass alle Escape-Sequenzen (z. B. \e[…m
zum Ändern von Textattributen - beachten Sie, dass diese möglicherweise über Variablen wie vorhanden sind $fg[red]
) enthalten sind %{…%}
. Da Sie oh-my-zsh verwenden, überprüfen Sie sowohl Ihre eigenen Einstellungen als auch die Definitionen, die Sie in oh-my-zsh verwenden.
Das gleiche Problem tritt in der Bash auf. Es müssen Sequenzen mit der Breite Null in einer Eingabeaufforderung 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 Ihres Terminals nicht mit der in der Shell deklarierten Codierung übereinstimmt und die beiden Codierungen für bestimmte Bytefolgen unterschiedliche Breiten ergeben. In der Regel tritt dieses Problem möglicherweise auf, wenn Sie ein Nicht-Unicode-Terminal verwenden, aber ein Unicode-Gebietsschema deklarieren oder umgekehrt.
Anwendungen verwenden Umgebungsvariablen, um das Gebietsschema zu ermitteln. die relevante Einstellung ist LC_CTYPE
, die aus den Umgebungsvariablen bestimmt LANGUAGE
wird LC_ALL
, LC_CTYPE
und LANG
(die erste von diesen, die festgelegt wird, gilt). Der Befehl locale | grep LC_CTYPE
teilt Ihnen Ihre aktuelle Einstellung mit. In der Regel können Sie Probleme mit der Ländereinstellung am besten vermeiden LC_CTYPE
, indem Sie den Terminalemulator festlegen lassen , da er weiß, welche Codierung er erwartet. Aber wenn das bei Ihnen nicht funktioniert, stellen Sie sicher, dass Sie festlegen LC_CTYPE
.
Dieselben Symptome können auftreten, wenn der vorherige Befehl eine Ausgabe anzeigt, die nicht in einer neuen Zeile endet, sodass die Eingabeaufforderung in der Mitte der Zeile angezeigt wird, die Shell dies jedoch nicht erkennt. In diesem Fall würde dies nur nach dem Ausführen eines solchen Befehls geschehen, nicht dauerhaft.
Wenn eine Zeile nicht richtig angezeigt wird, wird sie mit dem Befehl redisplay
oder clear-screen
( standardmäßig an Ctrl+ gebunden L) behoben.