Die ersten Zeichen des Befehls werden nach Abschluss im Display wiederholt


21

Die ersten beiden Zeichen wurden wiederholt, während ich Tabdie Vervollständigung durchführte. In der Abbildung unten cdwird wiederholt.

Bildbeschreibung hier eingeben

Ich habe rxvt-unicdoe, xterm, terminator ausprobiert. Alle diese Terminalemulatoren haben dieses Problem.

Zsh Version 5.0.2, Konfigurationsdatei on-my-zsh


Werden die Zeichen im Befehl, den zsh ausführt, wiederholt oder werden sie nur angezeigt? Ändert sich die Anzahl der Zeichen, wenn der Befehl länger als zwei Zeichen ist? Ändert sich die Nummer, wenn sich das aktuelle Verzeichnis ändert?
Gilles 'SO- hör auf böse zu sein'

@Gilles Das wiederholte Zeichen ist im Befehl nicht vorhanden. Ich kann den Befehl ausführen.
16.

Antworten:


32

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, PROMPToder die Variablen, auf die sie verweisen) und stellen Sie sicher, dass alle Escape-Sequenzen (z. B. \e[…mzum Ä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 LANGUAGEwird LC_ALL, LC_CTYPEund LANG(die erste von diesen, die festgelegt wird, gilt). Der Befehl locale | grep LC_CTYPEteilt 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 redisplayoder clear-screen( standardmäßig an Ctrl+ gebunden L) behoben.


Vermutlich fehlt mir eine verwandte Schriftart. Ich stelle fest, dass der erste Buchstabe seltsam ist. Es wird erwartet, dass ->ich denke
jilen

@jilen Ah, dies könnte ein weiteres Problem sein, das ich vergessen habe zu erwähnen: Vielleicht enthält Ihre Eingabeaufforderung Nicht-ASCII-Zeichen in einer anderen Codierung als Ihr Terminal, wobei eine oder beide Codierungen Multibyte sind. Wenn Sie dabei Hilfe benötigen, veröffentlichen Sie die Ausgabe von localeund von echo $PS1 | od -t x1(und das Gleiche mit jeder anderen von verwendeten Variablen $PS1).
Gilles 'SO- hör auf böse zu sein'

2
Ich habe vergessen, das Gebietsschema festzulegen (ich verwende Archlinux, das Gebietsschema wird standardmäßig nicht festgelegt). Nach dem Festlegen des Gebietsschemas ist dieses Problem behoben. Vielen Dank, Mann!
Juli

Ich habe es hochgestuft, weil es ziemlich großartig ist. Escape-Zeichen müssen jedoch nicht unbedingt in die Klammern eingeschlossen werden, wenn Sie die Cursoranzahl ansonsten selbst verwalten. Das Aufrufen einer untergeordneten Funktion hat in der Vergangenheit für mich funktioniert - oder Umleitungen, die immer noch auf / dev / tty landen, ohne dass stdout involviert ist, könnten funktionieren. Andere Methoden, die funktioniert haben - \e{7,8}zum Speichern / Wiederherstellen von Cursorzuständen.
mikeserv

Es war das LC_CTYPE, was es für mich repariert hat. Ich hatte es eingestellt C, als ich es abstellte, funktionierte alles. Vielen Dank.
Jmaloney


1

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.


Wow, das hat tatsächlich funktioniert. Vielen Dank!
Paul Calabro

1

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/_/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.