Преобразование ключа Alt
вEscape
(ASCII 033,"\e"
)выполняется вашим эмулятором терминала, библиотека readline (, которая обрабатывает ~/.inputrc
), не участвует в этом.
Проблема в том, что нет способа отправить фактические события клавиш в программу, работающую в терминале; терминал преобразует их в последовательности байтов, которые программа может прочитать с tty.
Для клавиши Alt/Meta есть два способа сделать это:
Сопоставьте его с Escape (ASCII 033 / 0x1b)--нажатие Alt-K
фактически отправит "\ek"
,Alt-Shift-K
"\eK"
и т. д. Это значение по умолчанию в большинстве эмуляторов терминала, но обычно оно настраивается, и у вас есть все причины, чтобы сделать его по умолчанию, если это уже не так.
Включите старший 7-й бит значения ASCII клавиши --. Нажатие Alt-K
фактически отправит байт 0x6b | 0x80 = 0xeb
, где 0x6b
является значением ASCII "k"
.
Именно последний распознается как "\M-k"
в привязках readline.
И это не работает и ужасно нарушается с любыми многобайтовыми локалями, такими как en_US.UTF-8
(, которые используются по умолчанию в большинстве современных систем ). В такой системе эмулятор терминала может не отправлять необработанный 0xeb
байт (, который не является допустимой последовательностью UTF -8, а является двоичным мусором ), но может преобразовать его из ISO -8859 -. ] 1 в UTF -8, что приводит к отправке"\xc3\xab" = "ë"
(e
с диэрезисом )при нажатии Alt-K
.
Но readline не знает, как сопоставить "ë"
обратно с "\M-k"
, сколько бы вы ни возились с множеством опций, таких как convert-meta
, enable-meta-key
, input-meta
и т. д.
И даже если бы вы могли это сделать, это все равно было бы сломано, потому что люди могут на самом деле захотеть ввести "ë"
и "ó"
и не оценят, что они обрабатываются как несвязанные ключи, такие как Alt-K
и Alt-S
.
Наконец-то нашел исправление.
Я думаю, что я был причиной проблемы, потому что я помню, как случайным образом выбирал более легкие пакеты программного обеспечения для установки, когда программа обновления программного обеспечения выскочила во время моего последнего сеанса и каким-то образом что-то сломалось. Я просто пытался сохранить данные, потраченные на установки :)
.