3

В Linux комбинация клавиш Ctrl - [ кажется эквивалентной нажатию клавиши Esc . Я хотел бы определить Ctrl - [ как ярлык в Emacs, но я не могу, потому что к тому времени, когда нажатие клавиши достигает Emacs, похоже, что клавиша Esc была нажата. Есть ли способ отключить это поведение, чтобы Ctrl - [ просто означало Ctrl - [?

Запуск Ubuntu 9.10 с GNOME.

2 ответа2

5

Предполагая, что вы запускаете 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
0

В зависимости от вашего xterm, вы можете использовать bindkey . Попробуйте выполнить эту команду в командной строке:

bindkey ^] tty-dsusp

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .