VT100-Escape-Sequenzen:Die Cursorbewegung wird bis zum Zeilenende fortgesetzt

StackOverflow https://stackoverflow.com//questions/25038426

  •  21-12-2019
  •  | 
  •  

Frage

Ich erstelle eine Telnet-CLI-Anwendung, die mit VT100-Escape-Sequenzen gesteuert wird.Also um z.B.Bewegen Sie den Cursor nach links. Die Escape-Sequenz <ESC>[D wird vom Telnet-Server an den Client gesendet, bei dem es sich um Putty oder Gnome-Terminal handeln kann.Bei Zeilen, die länger als die Putty-Zeilenlänge sind, erlaubt die obige Escape-Sequenz leider nicht, den Cursor zu der Zeile über der aktuellen Zeile zu bewegen.

Ein Beispiel.Cursor ist '|'.Kommentare sind mit „//“ gekennzeichnet.

----------------
>potato| // Now I press left arrow which sends esc sequence to application
----------------
>potat|o // Works as expected. The cursor moved left
----------------

Ein anderes Beispiel

----------------
>potatopotatopot // This is a long command which goes over two lines
|ato             // Now I press left arrow which sends esc sequence to application
----------------
>potatopotatopot // The cursor didn't move, since the escape sequence 
|ato             // does nothing if the cursor is at the edge
----------------

Ich habe nach einer anderen Escape-Sequenz gesucht, die am Rand umlaufen würde, habe aber keine gefunden.Ich habe keine Escape-Sequenz gefunden, die den Terminalmodus in etwas ändert, das das Umbrechen ermöglicht.

Wie wird eine solche Terminalnavigation im Allgemeinen gehandhabt?

War es hilfreich?

Lösung

Der bw Die Funktion in einer Termcap-Terminalbeschreibung gibt an, ob beim Verschieben nach links am Rand eines Bildschirms zur vorherigen Zeile umgebrochen wird.Es war in einer PuTTy-Beschreibung enthalten, die ich überprüft habe (infocmp putty unter ncurses), aber nicht in vielen anderen (z. B.nicht in infocmp gnome).

Sie könnten versuchen, den Überblick darüber zu behalten, in welcher Spalte sich der Cursor befindet, und Bewegungssteuerungssequenzen verwenden, wenn Sie zur vorherigen Zeile wechseln möchten.Sie müssten die Breite des Bildschirms des Benutzers kennen, was durch die Einstellung erfolgen kann LINES Und COLS Umgebungsvariablen.

Andere Tipps

Wie bereits erwähnt, die bw Diese Fähigkeit könnte einen Teil des Problems lösen, ist aber selten.Insbesondere ist es kein Feature von vt100-kompatiblen Programmen (wie xterm).Das OP erwähnte sowohl PuTTY als auch Gnome-Terminal.Letzteres wird nicht verwendet bw, daher wird eine andere Lösung bevorzugt.

Andererseits implementiert PuTTY den vt100 Cursorpositionsbericht welches von verwendet wird Größe ändern als Fallback, wenn die Bildschirmgröße nicht über Systemaufrufe ermittelt werden kann.Zitat aus xterm Steuersequenzen dokumentieren:

CSI Ps n  Device Status Report (DSR).
            Ps = 5  -> Status Report.
          Result (``OK'') is CSI 0 n
            Ps = 6  -> Report Cursor Position (CPR) [row;column].
          Result is CSI r ; c R

Der resize Das Programm nutzt dies von

  • Senden des Cursors an die untere rechte Ecke eines „riesigen“ (999 x 999) Fensters
  • Senden der CPR-Sequenz
  • Lesen des Berichts über die tatsächliche Cursorposition

Wenn der Server die Bildschirmgröße kennt, kann er den Cursor an sinnvollere Positionen senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top