
Насколько я понимаю, при наборе символов в эмуляторе терминала они появляются, потому что они "отражаются". Мы представляем, что терминал - это отдельное устройство, взаимодействующее с компьютером по двухстороннему каналу, и каждая нажатая клавиша не обновляет экран немедленно, а появляется, когда она отправляется обратно с компьютера.
Мой вопрос в том, как возможно, что клавиша backspace или любая другая клавиша, установленная на «стирание» с помощью stty
, может стирать символ на экране. Если в xterm
я делаю
$ stty erase x
$ cat -
aaaaaaaaaax
последний x
вводимый мной символ, похоже, стирает последний a
. Однако если бы это был настоящий терминал, отдельный от компьютера, он бы не смог узнать, какой символ stty erase
был. Единственный способ, которым я мог бы ожидать получить такое поведение, — это если бы символ стирания был ^H
и он был отображен эхом, а терминал интерпретировал это как специальный управляющий символ, сообщающий ему о необходимости стереть символ перед курсором.
Это особенность эмуляторов терминала, которые «обманывают» и ищут, что stty erase
это за персонаж?
решение1
Эмулятор терминала отправляет x
символ, а драйвер терминала видит, что он был настроен как символ стирания. Поэтому вместо того, чтобы отобразить его обратно в эмулятор, он отправляет соответствующую последовательность для стирания предыдущего символа (например, backspace-space-backspace).
Даже если символ стирания установлен на Backspace, простое повторение его не сотрет то, что было набрано. Когда BS
символ отправляется на терминал, он просто перемещает курсор на один символ влево, а не очищает его. Поэтому драйверу терминала все равно придется отправить дополнительный пробел-возврат, чтобы очистить его и оставить курсор в этом месте.