Как обновляется дисплей при вводе символа стирания в эмуляторе терминала?

Как обновляется дисплей при вводе символа стирания в эмуляторе терминала?

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

Мой вопрос в том, как возможно, что клавиша backspace или любая другая клавиша, установленная на «стирание» с помощью stty, может стирать символ на экране. Если в xtermя делаю

$ stty erase x
$ cat -
aaaaaaaaaax

последний xвводимый мной символ, похоже, стирает последний a. Однако если бы это был настоящий терминал, отдельный от компьютера, он бы не смог узнать, какой символ stty eraseбыл. Единственный способ, которым я мог бы ожидать получить такое поведение, — это если бы символ стирания был ^Hи он был отображен эхом, а терминал интерпретировал это как специальный управляющий символ, сообщающий ему о необходимости стереть символ перед курсором.

Это особенность эмуляторов терминала, которые «обманывают» и ищут, что stty eraseэто за персонаж?

решение1

Эмулятор терминала отправляет xсимвол, а драйвер терминала видит, что он был настроен как символ стирания. Поэтому вместо того, чтобы отобразить его обратно в эмулятор, он отправляет соответствующую последовательность для стирания предыдущего символа (например, backspace-space-backspace).

Даже если символ стирания установлен на Backspace, простое повторение его не сотрет то, что было набрано. Когда BSсимвол отправляется на терминал, он просто перемещает курсор на один символ влево, а не очищает его. Поэтому драйверу терминала все равно придется отправить дополнительный пробел-возврат, чтобы очистить его и оставить курсор в этом месте.

Связанный контент