Параметры stty изменяются с точки зрения патологии

Я просто установил новый компьютер и, как обычно, должен был изменить настройки в xterm , чтобы заставить ключи удаления работать правильно. (Ctrl-H отправляет ^H , backspace отправляет ^? Удаляет отправляет ^[[3~ . Это, конечно, объективно правильный способ сделать это.) Хотя настройки xterm по умолчанию являются проблематичными, в этой настройке все работает нормально , по крайней мере, на конце xterm.

Проблема в том, что по какой-то причине настройки stty в xterm всегда устанавливаются для erase = ^H Так же, как и беспорядок в стандартном вводе без чтения, это также заставляет tmux начинать молча перевод ^H на ^? в его окнах, что делает вещи, подобные emacs, весьма болезненными.

Я понятия не имею, почему stty настроен таким образом. Это не значение по умолчанию; набрав только stty чтобы отображать различия по умолчанию, показывает erase = ^H; строка и ручная печать stty erase ^? удаляет эту строку. (Это также устраняет проблемы с stdin и tmux.) Однако набирать это в каждом терминале, который я запускаю, является утомительным, и, хотя я могу поместить его в .bashrc или что-то еще, это кажется мне неправильным способом сделать это.

Что заставляет stty использовать эту конкретную неправильную настройку, отличную от значения по умолчанию? И как я могу заставить его остановиться?

Есть много способов сделать это. То, как вы упоминаете, может быть одним. xterm – это программа, которая запускает другую, – она ​​обертывает другую программу в pty – обычно вашу оболочку – и направляет входные данные, которые вы передаете в завернутые программы. Вещь о псевдотерминалах – это просто эмулируемые устройства – и поэтому xterm угадывает устройство, которое вы в конце концов набираете на нем. Конечно, вы можете получить более конкретную информацию. xterm все виды переменных окружения – и, еще лучше, xresources.

От man xterm :

  • ttyModes (класс TtyModes )
    • Задает строку, содержащую ключевые слова терминала и символы, с которыми они могут быть связаны. Допустимые ключевые слова включают: brk , dsusp , eof , eol , eol2 , erase , erase2 , flush , intr , kill , lnext , quit , rprnt , start , status , stop , susp , swtch и weras . Управляющие символы могут быть указаны как ^ char (например, ^c или ^u ) и ^? может использоваться для указания удаления (127). Используйте ^- для обозначения undef. Используйте \034 для представления ^\ , так как буквальная обратная косая черта в ресурсе X ускользает от следующего символа.
    • Это очень полезно для переопределения настроек терминала по умолчанию без необходимости выполнять stty каждом запуске xterm . Обратите внимание, однако, что программа stty на данном хосте может использовать разные ключевые слова; Встроенная таблица xterm .
    • Если ресурс ttyModes задает значение для стирания, это переопределяет ptyInitialErase ресурса ptyInitialErase , т. ptyInitialErase xterm инициализирует терминал для соответствия этому значению.