VT100 sequências de escape:O movimento do Cursor envoltório em torno do final da linha

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Eu estou criando um Telnet CLI aplicativo que é controlada com VT100 de sequências de escape.Então, para exemplo:navegue com o cursor a esquerda <ESC>[D seqüência de escape são enviados a partir do servidor de Telnet para o cliente, que pode ser o Putty ou Gnome-terminal.Infelizmente, com linhas que são mais do que a massa de Vidraceiro comprimento da linha, a seqüência de escape acima não permitirá navegar o cursor para a linha acima da linha atual.

Um exemplo.Cursor é '|'.Os comentários são marcadas com '//'

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

Outro exemplo

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

Fui pesquisar para qualquer outra sequência de escape que iria envolver em torno de quando a borda, mas não encontrei nenhum.Eu não encontrei qualquer sequência de escape que altera o modo de terminal para algo que permite a moldagem.

Então, como é o terminal de navegação como este comumente tratadas?

Foi útil?

Solução

O bw capacidade de um termcap terminal descrição diz se movendo para a esquerda na borda de uma tela passará para a linha anterior.Ele estava presente em uma Massa de descrição de eu verificado (infocmp putty em ncurses), mas não em muitos outros (por exemplo,não infocmp gnome).

Você poderia tentar manter o controle de qual coluna que o cursor está, e use o movimento de sequências de controle quando você deseja quebrar redonda para a linha anterior.Você teria que saber a largura da tela do usuário, o que pode ser feito por eles, definindo o LINES e COLS variáveis de ambiente.

Outras dicas

Como observado, o bw capacidade poderia resolver parte do problema, mas é raro.Em particular, ele não é um recurso de vt100-programas compatíveis (como o xterm).O OP mencionado tanto o PuTTY e o gnome-terminal.Este não usar bw, então, uma solução diferente é o preferido.

Por outro lado, o PuTTY não implementar o vt100 posição do cursor relatório que é usado por redimensionar como uma alternativa, quando não é possível obter o screensize através de chamadas do sistema.Citando de forma que o xterm as sequências de controle 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

O resize o programa usa isso

  • enviar o cursor para o canto inferior direito de um "enorme" (999 por 999) janela
  • enviar a sequência de RCP
  • a leitura do relatório da posição actual do cursor

Sabendo o screensize, o servidor poderia enviar o cursor para mais útil posições.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top