Die ersten beiden Zeichen wurden wiederholt, während ich Tabdie Vervollständigung durchführte. In der Abbildung 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
zsh
line-editor
oh-my-zsh
jilen
quelle
quelle
Antworten:
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 bestimmtLANGUAGE
wirdLC_ALL
,LC_CTYPE
undLANG
(die erste von diesen, die festgelegt wird, gilt). Der Befehllocale | grep LC_CTYPE
teilt Ihnen Ihre aktuelle Einstellung mit. In der Regel können Sie Probleme mit der Ländereinstellung am besten vermeidenLC_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 festlegenLC_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
oderclear-screen
( standardmäßig an Ctrl+ gebunden L) behoben.quelle
->
ich denkelocale
und vonecho $PS1 | od -t x1
(und das Gleiche mit jeder anderen von verwendeten Variablen$PS1
).\e{7,8}
zum Speichern / Wiederherstellen von Cursorzuständen.LC_CTYPE
, was es für mich repariert hat. Ich hatte es eingestelltC
, als ich es abstellte, funktionierte alles. Vielen Dank.Ich hatte das gleiche Problem und fand meine Lösung hier: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . Fügen Sie einfach folgendes in Ihr
~/.zshrc
.export LC_CTYPE=en_US.UTF-8
quelle
locale
ich benutzte, zurücksetzen , aber es funktionierte für mich. Diese Antwort enthält die notwendigen Schritte für Ubuntu.Ich hatte dieses Problem in iTerm 2 auf MacOS. Ich habe das Problem gelöst, indem ich zu Einstellungen -> Profile -> Text gegangen bin und "Unicode-Version 9-Breiten verwenden" angekreuzt habe.
quelle
Ich habe dieses Problem mit Ubuntus Docker-Image (
ubuntu:latest
). Ich habe es mit den Anweisungen auf der entsprechenden Seite behoben: https://hub.docker.com/_/ubuntuquelle