У програмі Shift + Up не розпізнається Emacs в терміналі, я пояснюю, як термінали переводять більшість функціональних клавіш у послідовності евакуації, оскільки інтерфейс між додатками та терміналами передає символи (а точніше байти), а не ключі. Лише кілька комбінацій модифікаторів + символів мають власний характер:
- Ctrlплюс літера або один із
@[\]^_
перетворень на байти 0–31 ( контрольні символи ASCII ).
- Часто Ctrl+ ?перетворюється на байт 127, а Ctrl+ Spaceеквівалентно Ctrl+ @(байт 0).
- Деякі функціональні клавіші еквівалентні символам управління: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- І Backspace= Ctrl+ Hабо Ctrl+ ?залежно від конфігурації. Ctrl+ ?зручніше для Emacs, оскільки Ctrl+ H- це допомога.
- Meta+ characterнадсилається відповідно Escдо символу .
Що ж робити з іншими комбінаціями, такими як Ctrl+ ;або Ctrl+ Shift+ letter? Оскільки відповідного символу немає, термінал повинен або повторно використовувати символ, або надіслати послідовність відходу. Багато терміналів ігнорують модифікатори, коли немає відповідного символу, тому в кінцевому підсумку ви отримуєте Ctrl+ ;відправлення ;
, Ctrl+ Shift+ letterеквівалент Ctrl+ letterта ін.
Постачальники терміналів тривалий час займалися простою справою. Не було стандартів для послідовностей евакуації, який самовдовжувався - постачальники терміналів не реалізують його, програми не підтримують його, користувачі цього не очікують. Деякі емулятори терміналів можуть бути налаштовані для надсилання довільних послідовностей евакуації, тому, якщо ваш, ви можете налаштувати його та оголосити послідовності виходу в Emacs (докладніше про це пізніше).
Останнім часом ситуація змінюється, оскільки було дві пропозиції щодо стандартизації послідовностей втечі. Один - лінійна клавіша LeoNerd із синтаксисом . Інша - xterm Томаса Дікі з синтаксисом . Поточні версії xterm (≥216) можна налаштувати для будь-якого синтаксису, встановивши ресурс; функцію потрібно активувати, встановивши ненульове значення.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Якщо ваш термінальний емулятор не підтримує ці синтаксиси, але їх можна налаштувати, виберіть будь-який.
Оскільки Emacs 24.4, Emacs автоматично включає modifyOtherKeys
функцію, коли виявляє, що термінал має xterm версії ≥216. Виявлення Emacs послідовностей виходу для кодування ключів працює через змінну local-function-key-map
. Станом на Emacs 24.4 підтримуються не всі послідовності втечі. Ви можете використовувати наступний код у своєму файлі init, щоб виконати завдання.
;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
"Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
(if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
(and (<= ?a c) (<= c ?z)))
(logand c ?\x1f)
(logior (lsh 1 26) c))))
(if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
(if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
(vector c))
(defun my-eval-after-load-xterm ()
(when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
(let ((c 32))
(while (<= c 126)
(mapc (lambda (x)
(define-key xterm-function-map (format (car x) c)
(apply 'character-apply-modifiers c (cdr x))))
'(;; with ?.VT100.formatOtherKeys: 0
("\e\[27;3;%d~" meta)
("\e\[27;5;%d~" control)
("\e\[27;6;%d~" control shift)
("\e\[27;7;%d~" control meta)
("\e\[27;8;%d~" control meta shift)
;; with ?.VT100.formatOtherKeys: 1
("\e\[%d;3u" meta)
("\e\[%d;5u" control)
("\e\[%d;6u" control shift)
("\e\[%d;7u" control meta)
("\e\[%d;8u" control meta shift)))
(setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))
Якщо TERM
змінна середовища не встановлена xterm
або такий варіант, як xterm-256color
, наприклад , Emacs не активує ці послідовності. Якщо Emacs вже підтримує ваше значення TERM
, ви можете додати підтримку, визначивши функцію, аналогічну вищевказаній, яка буде виконуватися після завантаження файлу Lisp, ім'я якого значенняTERM
. Якщо Emacs не має такої підтримки, ви можете додати її, створивши підкаталог, який називається term
десь у вашому load-path
, та створивши файл Lisp, який називається, term/$TERM.el
де $TERM
є значенням TERM
, визначивши функцію, що називається terminal-init-$TERM
.
Як я пишу, схоже, що мало емуляторів терміналів, окрім xterm, прийняли ці послідовності виходу. На OSX ви можете налаштувати iTerm2 , вибравши послідовність виходу для кожної комбінації клавіш по черзі.
C-;
комбінацією, а потім скористайтеся,M-x view-lossage
щоб побачити, чи не потрапляє він до Emacs.