Текстовый терминал передает только символы (точнее, байты), а не ключи. Ключи и цепочки ключей (ключи с модификаторами) кодируются как последовательности символов. Ключи, которые вставляют печатаемые символы, отправляются как они сами; функциональные клавиши отправляются как escape-последовательности. Большинство escape-последовательностей состоят из символа Escape ( ?\e
в синтаксисе Emacs), за которым следуют два или более печатных символа. См. Управление и клавиши вверх / вниз на терминале для использования emacs и Как работает ввод с клавиатуры и вывод текста? Чтобы получить больше информации.
В Emacs есть механизм для перевода escape-последовательностей в собственное представление о ключах. Таблица перевода input-decode-map
инициализируется при запуске Emacs (или, точнее, при открытии нового фрейма: эта переменная имеет разные значения на каждом терминале). Иногда Emacs не знает всех escape-последовательностей, отправленных терминалом.
В вашем случае кажется, что Emacs имеет неверную интерпретацию для escape-последовательности, отправленной Shift+ Up. Вы должны сказать это, чтобы интерпретировать это как, S-up
а не select
. Сначала выясните, что такое escape-последовательность. В *scratch*
буфере нажмите Ctrl+, Qзатем Shift+ Up. Команда C-q
заставляет следующий символ, который является escape-символом, вставляться буквально, сопровождаемый остальной частью escape-последовательности. Допустим, что Shift+ Upотправляет \e[1;2A
в нашу систему, тогда вам нужно переопределить соответствующую запись в input-mode-map
:
(define-key input-decode-map "\e[1;2A" [S-up])
В принципе, input-decode-map
должен быть установлен для каждого терминала. На практике очень редко иметь два терминала, в которых одна и та же escape-последовательность кодирует разные ключи, поэтому глобальная настройка будет работать нормально.
Are the (define-key ...)
команды должны идти в init.el? Есть ли где-нибудь подробный пример, на который я могу посмотреть?