VT100 sequências de escape:O movimento do Cursor envoltório em torno do final da linha
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?
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.