В Shift + Up не распознается Emacs в терминале. Я объясняю, как терминалы переводят большинство функциональных клавиш в escape-последовательности, потому что интерфейс между приложениями и терминалами передает символы (или, скорее, байты), а не ключи. Только несколько комбинаций модификатор + символ имеют свой собственный характер:
- 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? Поскольку соответствующего символа нет, терминал должен либо повторно использовать символ, либо отправить escape-последовательность. Многие терминалы игнорируют модификаторы, когда нет соответствующего символа, поэтому вы в конечном итоге Ctrl+ ;отправка ;
, Ctrl+ Shift+ letterэквивалент Ctrl+ letterи т. Д.
Поставщики терминалов долгое время занимались этим простым делом. Не было никакого стандарта для escape-последовательностей, который был самосохраняющимся - поставщики терминалов не реализуют его, приложения не поддерживают его, пользователи не ожидают этого. Некоторые эмуляторы терминала могут быть сконфигурированы для отправки произвольных escape-последовательностей, так что если вы можете, вы можете настроить их и объявить escape-последовательности в Emacs (подробнее об этом позже).
В последнее время ситуация меняется, потому что было два предложения стандартизировать escape-последовательности. Одним из них является libtermkey от LeoNerd с синтаксисом . Другой - xterm Томаса Дики с синтаксисом . Текущие версии xterm (≥216) могут быть настроены для любого синтаксиса путем установки ресурса; функция должна быть активирована путем установки ненулевого значения.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Если ваш эмулятор терминала не поддерживает эти синтаксисы, но может быть настроен, выберите либо.
Начиная с Emacs 24.4, Emacs автоматически включает эту modifyOtherKeys
функцию, когда обнаруживает, что терминал имеет версию xterm ≥216. Обнаружение Emacs escape-последовательностей для кодирования ключей работает через переменную local-function-key-map
. Начиная с Emacs 24.4, поддерживаются не все escape-последовательности. Вы можете использовать следующий код в вашем файле инициализации, чтобы завершить работу.
;; 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, приняли эти escape-последовательности. В OSX вы можете настроить iTerm2 , выбирая escape-последовательность для каждой комбинации клавиш, одну за другой.
C-;
комбо, а затем использовать,M-x view-lossage
чтобы увидеть, если это даже добраться до Emacs.