Angenommen, Ihr Terminalfenster ist 80 Spalten breit und Sie führen ein Python-Skript aus, das nur Folgendes enthält:
print("x" * 81 + "\b\by")
Sie würden erwarten, dass die Ausgabe eine Zeile voller ist, mit x
Ausnahme der letzten, die ein sein sollte y
. Mein Problem ist, dass die Ausgabe, die ich erhalte, eine Zeile voller ist x
und eine zweite Zeile ein einzelnes enthält y
. Tatsache ist, dass immer, wenn das Backspace-Zeichen auf stdout gedruckt werden soll, es wie erwartet funktioniert, außer wenn Zeilenumbrüche vorhanden sind und der Cursor eine Zeile höher platziert werden sollte: in diesem Fall scheint es aus dem stdout-Puffer ausgeschlossen zu sein.
Ich kann dieses Verhalten auf verschiedene Weise entlang der Linien des obigen Snippets reproduzieren, z. B. echo -e "xx...x\b\by"
versucht mit bash und sh, printf(...);
für C/C++, cout << ...;
für C++. Dasselbe Problem bei cat
einer Datei, die Backspace-Zeichen enthält, und auch beim Eintippen für einen Stdin-Lesevorgang, der mehr als eine Terminalfensterzeile benötigt. Im letzteren Fall '\b'
werden Zeichen ersetzt, indem ich die Backspace-Taste mehrmals drücke: Wenn ich die Fensterbreite überschreite und Zeilen umbrochen werden, kann ich vorherige Zeilen nicht durch wiederholtes Drücken der Backspace-Taste erreichen, aber diese Treffer werden wie erwartet vom aufrufenden Programm verarbeitet, z. B. würden sie bei einem scanf("%s", s);
Aufruf s
dann 79 x
und 1 enthalten y
, dem obigen Beispiel folgend. Das Lustige dabei ist, dass, wenn ich die Fenstergröße so ändere, dass die neue Cursorposition nicht mehr in der ersten Spalte des Fensters ist, ich in der Lage bin, zur neuen ersten Spaltenposition zurückzubacken und auf diese Weise weiterzumachen, bis nur noch eine Terminalzeile übrig ist; dann stellt sich heraus, dass es eine Position gibt, an der ich nicht weiter backspacen kann – aber ich konnte nicht herausfinden, wie ich diese Position vorhersagen kann.
Eine weitere Situation, in der Zeilenumbrüche und Rücktaste aufeinandertreffen, ist, wenn man einen langen Befehl eingibt und mit der Rücktaste zur ersten Zeile zurückkehren möchte. Ich habe dabei keine Probleme.
Ich verwende Ubuntu 18.04 und habe das oben genannte mit verschiedenen Terminalemulatoren ausprobiert, nämlich Gnome-Terminal, XVT und Tilda. Ich wäre für jeden Hinweis sehr dankbar. Danke!
Antwort1
tmux
, screen
, urxvt
verhalten sich wie gewünscht. xterm
kann auf dieses Verhalten umgestellt werden durch Aktivieren vonReverse-Wraparound-Modus: printf '\e[?45h'
.
Es ist ein Vermächtnis, das von Grund auf kaputt ist, und niemand hat sich wirklich darum gekümmert, es zu reparieren. Es gibt noch mehr Probleme als das, das Sie angesprochen haben. SieheVTE Ausgabe 62für weitere Details.
wenn ich einen langen Befehl eingebe und mit der Rücktaste zur ersten Zeile zurückkehren möchte. Ich habe dabei keine Probleme.
In diesem Fall verwenden Sie die Zeilenbearbeitung der Shell (z. B. die Bibliothek Readline), die eine komplexere Bildschirmbehandlung durchführt als nur die Ausgabe einer Rücktaste.
Antwort2
Windows 7 Python 3.7.4
print("x" * 81 + "y")
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
Ist es das was du willst?