Предполагая, что вы запускаете Emacs непосредственно под оконной системой (Cocoa, MS-DOS, Windows, X, ...), а не внутри текстового терминала (gnome-terminal, konsole, rxvt, xterm, ...), это возможно ,
(define-key key-translation-map [?\C-\[] [(control left_bracket)])
(define-key key-translation-map [escape] [?\e])
(define-key function-key-map [escape] nil)
(define-key function-key-map [?\e] nil)
(when (boundp 'local-function-key-map)
;;(define-key local-function-key-map [escape] nil)
(defun remove-escape-from-local-function-key-map ()
(define-key local-function-key-map [?\e] nil)
(define-key local-function-key-map [escape] nil))
(add-hook 'term-setup-hook 'remove-escape-from-local-function-key-map))
Здесь есть три разных входных события:
Ctrl+[, то есть модификатор control
вместе с клавишей, которая отправляет символ [
. Emacs обычно показывает это как C-[
(и C-[
принятый kbd
), если у него нет особого случая для этого, как объяснено ниже.
Символ № 27, который отправляется клавишей Esc в некоторых системах. Emacs показывает это как ESC
при отображении последовательностей клавиш и \e
в строках.
Сам ключ Esc (в X Window это означает ключ Escape
). Emacs показывает это как escape
если не переведено (см. Ниже).
Emacs обычно переводит escape
в ESC
, но это делается на относительно высоком уровне, в function-key-map
, поэтому его можно переопределить, изменив function-key-map
или определив привязку для escape
в глобальной таблице ключей или локальном раскладка. В GNU Emacs 23 вводится local-function-key-map
которая применяется для каждого типа терминала.
Emacs всегда переводит C-[
в ESC
, на очень низком уровне (в keyboard.c
). Это не настраивается.
Тем не менее, Emacs предоставляет способ перевода ключей на относительно низком уровне: key-translation-map
. Это применяется перед любой глобальной или локальной привязкой, но только для ключей, которых нет в function-key-map
. Таким образом, хитрость заключается в том, чтобы обменять ESC
и escape
в этой точке.
Эти механизмы описаны в руководстве по Emacs Lisp под заголовком "Преобразование ключей".
Кстати, аналогичные принципы применяются к
C-i
, TAB
, \t
tab
C-m
, RET
, \r
, return