Ich schreibe einen Filter (in einer Pipe, der für einen Terminal-Ausgang bestimmt ist), der manchmal eine Zeile "überschreiben" muss, die gerade aufgetreten ist. Es funktioniert, indem stdin übergeben wird, um Zeichen für Zeichen auszusteigen, bis eine \n
erreicht ist, und dann spezielles Verhalten aufrufen. Mein Problem betrifft die Rückkehr zum Anfang der Zeile.Zurücksetzen des Terminal-Cursors zum Zeilenanfang mit aktiviertem Wrapping
Das erste, woran ich dachte, war eine \r
oder die ANSI-Sequenz \033[1G
. Wenn die Linie jedoch lang genug war, um das Terminal umwickelt zu haben (und somit zum Scrollen geführt hat), wird der Cursor nur zur aktuellen physischen Linie zurückbewegt.
Meine zweite Idee war, die Länge der Zeile zu verfolgen (Anzahl der Zeichen seit dem letzten \n
übergeben), und dann echo \b
, dass viele Male. Das geht jedoch schief, wenn die Zeile Steuerzeichen oder Escape-Sequenzen (und möglicherweise Unicode?) Enthielt.
Wenn Sie nicht nach allen speziellen Sequenzen suchen und diese verwenden, um meine Zeichenanzahl anzupassen, gibt es eine einfache Möglichkeit, dies zu erreichen?
Danke für den Vorschlag! Leider gibt es ein paar Gründe, warum ich nicht denke, dass das für mich funktioniert: * Ich müsste immer noch spezielle Fallfolgen verfolgen, um zu wissen, wie nahe ich der Kante bin. * Ich bin vielleicht nicht das letzte Ding die Pipeline Für Kontext; Mein Filter ist Pattern-Matching und "Re-Writing" passender Strings, die in farbigen Escape-Sequenzen umgeben sind. Ich kann 'fgets()' nicht verwenden und ganze Strings gleichzeitig bearbeiten, da einige meiner Eingaben eine "dynamische" Ausgabe (z. B. einen inkrementierenden Fortschrittsstatus) erzeugen, die '\ n' für eine Weile nicht ausgibt. –