Hallo,
via tput
lassen sich bekanntlich die in terminfo
gepeicherten Capnames benutzen, welche die jeweils für das Terminal geltenden Steuersequenzen abstrahieren. In meinem Fall geht es darum, mehrzeiligen Text zu updaten, indem immer wieder mit dem Cursor zurück an den Anfang des Textes gesprungen wird. Dafür nutze ich die Capnames sc
zum Speichern der Position, bevor ich mit dem Schreiben anfange und danach rc
zum Wiederherstellen der Position, damit neuer Text drübergeklatscht werden kann. Das ganze sieht beispielhaft so aus:
1 2 3 4 | urx@murx:~$ echo -e "$(tput sc)aaaaaa\nbbbbbb\ncccccc $(tput rc)111\n222" 111aaa 222bbb urx@murx:~$ |
Es werden also zunächst die 3 Zeilen mit je 6 Buchstaben geschrieben. Dann wird zurückgesprungen und über 2 Zeilen die jeweils ersten 3 Zeichen mit Zahlen überschrieben. Die letzte Zeile mit den "c"'s überschreibt natürlich der Prompt.
Das alles ist schön und funktioniert wie gewünscht. Das Problem tritt erst in dem Moment auf, in dem man das Ende des Emulator-Fensters erreicht hat und der Inhalt entsprechend gescrollt wird, um Platz für eine neue Zeile zu schaffen. Die Ausgabe sieht dann so aus:
1 2 3 4 5 6 | urx@murx:~$ echo -e "$(tput sc)aaaaaa\nbbbbbb\ncccccc $(tput rc)111\n222" aaaaaa bbbbbb 111ccc 222 urx@murx:~$ |
Der Cursor springt also wieder 2 Zeilen nach oben zur alten Position und überschreibt den Text von da aus. Dumm nur, dass an dieser Stelle jetzt nicht mehr die erwarteten "a"'s , sondern eben die hochgerutschten "c"'s stehen. Ich hoffe, die Problematik ist damit klar geworden.
Meine Frage an euch ist nun, ob ihr irgendeine Möglichkeit kennt, genau dies zu verhindern. Der Cursor soll also nicht bezogen auf den sichtbaren Bereich hochspringen, sondern bezogen auf den vorher geschriebenen Text.