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