Escape-последовательности VT100:Движение курсора переносится до конца строки
Вопрос
Я создаю приложение Telnet CLI, которое управляется с помощью escape-последовательностей VT100.Так, например.переместите курсор влево, <ESC>[Escape-последовательность D отправляется с сервера Telnet клиенту, которым может быть Putty или Gnome-терминал.К сожалению, если длина строк превышает длину строки Putty, приведенная выше escape-последовательность не позволит переместить курсор к строке над текущей строкой.
Пример.Курсор — «|».Комментарии отмечены знаком '//'
----------------
>potato| // Now I press left arrow which sends esc sequence to application
----------------
>potat|o // Works as expected. The cursor moved left
----------------
Другой пример
----------------
>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
----------------
Я искал любую другую escape-последовательность, которая могла бы оборачиваться на краю, но не нашел ее.Я не нашел никакой escape-последовательности, которая меняет режим терминала на что-то, допускающее перенос.
Так как же обычно осуществляется подобная навигация по терминалу?
Решение
А bw
В описании терминала termcap указывается, переносится ли перемещение влево по краю экрана на предыдущую строку.Он присутствовал в описании PuTTy, которое я проверил (infocmp putty
под ncurses), но не во многих других (например.не в infocmp gnome
).
Вы можете попытаться отслеживать, в каком столбце находится курсор, и использовать последовательности управления движением, когда хотите перейти на предыдущую строку.Вам нужно будет знать ширину экрана пользователя, что можно сделать, установив LINES
и COLS
переменные окружающей среды.
Другие советы
Как отмечалось, способность генеракодицетагкода может решить часть проблемы, но это редко. В частности, это не особенность совместимых VT100 программ (таких как xterm). ОП упомянул как штукатуру, так и гнома-терминал. Последнее не использует генеракодицетагкод, поэтому является предпочтительным решением.
С другой стороны, замазку делает отчет о положении курсора VT100 , который используется изменение изменений в качестве загрязнения, когда он не может получить скринизм с использованием системных вызовов. Цитата из Xterm's