Sequenze di fuga VT100: il movimento del cursore avvolge fino alla fine della linea

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

  •  21-12-2019
  •  | 
  •  

Domanda

Sto creando un'applicazione CLI Telnet controllata con sequenze di fuga VT100.Quindi per ad es.Navigare il cursore a sinistra La sequenza di esclusione [D viene inviato dal server Telnet al client, che può essere putty o gnome-terminale.Sfortunatamente, con linee più lunghe della lunghezza della linea di pugno, la sequenza di escape sopra non consentirà di navigare il cursore alla riga sopra la linea corrente.

Un esempio.Cursore è '|'.I commenti sono contrassegnati con '//'

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

Un altro esempio

----------------
>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
----------------
.

Ho cercato qualsiasi altra sequenza di fuga che avrebbe avvolto quando ai margini, ma non ho trovato nessuno.Non ho trovato nessuna sequenza di escape che cambia la modalità terminale a qualcosa che consente di avvolgere.

Allora, come è la navigazione del terminale come questa comunemente gestita?

È stato utile?

Soluzione

La funzionalità bw in una descrizione del terminale Terminale dice se spostarsi a sinistra sul bordo di un schermo involucro alla riga precedente.Era presente in una mastice Descrizione che ho controllato (infocmp putty sotto Ncurses), ma non in molti altri (ad es. Non in infocmp gnome).

È possibile provare a tenere traccia di quale colonna il cursore è dentro e utilizza sequenze di controllo del movimento quando si desidera avvolgere intorno alla riga precedente.Dovresti sapere la larghezza della schermata dell'utente, che può essere eseguita da loro impostando le variabili ambientali LINES e COLS.

Altri suggerimenti

Come notato, la capacità bw potrebbe risolvere parte del problema, ma è raro. In particolare, non è una caratteristica dei programmi compatibili con VT100 (come XTERM). L'OP ha menzionato sia il mastice che il terminale Gnome. Quest'ultimo non utilizza bw, quindi è preferibile una soluzione diversa.

D'altra parte, Putty implementa il VT100 Report della posizione del cursore che viene utilizzato da ridimensiona come fallback quando non è possibile ottenere lo screensima utilizzando le chiamate di sistema. Citando da Xterm Sequenze di controllo Documento:

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
.

Il programma resize utilizza questo da

    .
  • Invio del cursore nell'angolo in basso a destra di una finestra "enorme" (999 per 999)
  • Invio della sequenza CPR
  • Lettura del report della posizione attuale del cursore

Conoscere la schermata, il server potrebbe inviare il cursore a posizioni più utili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top