Странность символа возврата

Интересно, почему символ возврата в общих терминалах Linux на самом деле не стирает символы при печати (который обычно работает при вводе)..

Это работает как ожидалось:

$ echo -e "abc\b\b\bxyz"
xyz

(\b оценивает для возвращения, может быть вставлен также как Ctrl+V Ctrl+H - представленный как ^H (0x08))

но когда существует меньше символов после того, как клавиши Backspace, странное поведение будет показано:

$ echo -e "abc\b\b\bx"
xbc

это ведет себя как клавиши со стрелкой влево вместо клавиши Backspace:

$ echo -e "abc\e[D\e[D\e[Dx"
xbc

строка стирания назад обычно работает:

$ echo -e "abc\e[1Kx"
x

На самом деле, когда я ввожу Клавишу Backspace Ctrl+V в терминале, ^? (0x7f) вместо приводят ^H, это - символ ASCII Del, но Ctrl+V Del производит <ESC>[3~, но это - другая история..

Таким образом, кто-то может объяснить, почему печатный символ возврата не стирает символы?

(Моей средой является xterm Linux и некоторые другие эмуляторы терминала, $TERM == xterm, испытанный vt100, Linux также)

10
задан Bugfinger 13 June 2016 в 21:02
поделиться

1 ответ

То, что вы видите, верно. Backspace или ^ H перемещает курсор влево без стирания. Чтобы стереть символ, нужно вывести ^ H ^ H (Backspace-Space-Backspace).


Чтобы ответить на ваш комментарий - Backspace определяется таким образом в семействе терминалов VT100 / ANSI, из которого заимствовано множество последовательностей кода управления терминалом. См. Руководство пользователя VT100 здесь , в котором функция BS определяется как «Перемещает курсор влево на одну позицию символа, если он не находится на левом поле, и в этом случае никаких действий не происходит». Другими словами, это причуда истории :)

Что касается того, почему это было изначально определено таким образом - я думаю, более гибко иметь неразрушающий код управления перемещением курсора, поскольку деструктивное обратное пространство может быть реализовано, как показано выше.

19
ответ дан 3 December 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: