Изменение привязок клавиш
Чтобы изменить привязку клавиши, нужно изменить её запись в карте клавиш. Если изменить привязку в глобальной карте клавиш, изменение вступит в силу во всех буферах (хотя оно не окажет прямого влияния на буферы, в которых глобальная привязка перекрыта локальной). Если изменить локальную карту текущего буфера, это обычно затронет все буферы, использующие тот же основной режим. Функции keymap-global-set и keymap-local-set предоставляют удобный интерфейс для этих операций (см. Команды для привязки клавиш). Можно также использовать keymap-set, более универсальную функцию; в этом случае необходимо явно указать изменяемую карту.
Выбирая последовательности клавиш для перепривязки в программах на Lisp, следуйте соглашениям Emacs об использовании различных клавиш (см. Соглашения о привязке клавиш).
Функции ниже сигнализируют об ошибке, если keymap не является картой клавиш или если key не является допустимой клавишей.
key — это строка, представляющая одну клавишу или последовательность нажатий клавиш, и она должна удовлетворять key-valid-p. Нажатия клавиш разделяются одним пробелом.
Каждое нажатие клавиши — это либо отдельный символ, либо имя события в угловых скобках. Кроме того, перед любым нажатием клавиши может указываться один или несколько модификаторов. Наконец, для ограниченного числа символов предусмотрен специальный сокращённый синтаксис. Вот несколько примеров последовательностей клавиш:
- f
-
Клавиша f.
- S o m
-
Последовательность из трёх клавиш: S, o и m.
- C-c o
-
Последовательность из двух клавиш: клавиша c с модификатором control, а затем клавиша o.
- H-LEFT
-
Клавиша с именем LEFT с модификатором hyper.
- M-RET
-
Клавиша RET или Return с модификатором meta.
- C-M-SPC
Клавиша SPC с модификаторами control и meta.
Специальный сокращённый синтаксис предусмотрен только для клавиш NUL, RET, TAB, LFD, ESC, SPC и DEL.
Модификаторы необходимо указывать в алфавитном порядке: «A-C-H-M-S-s», то есть «Alt-Control-Hyper-Meta-Shift-super».
- Функция: keymap-set keymap key binding
-
Эта функция задаёт привязку для key в keymap. Аргумент key — это строка, которая должна удовлетворять
key-valid-p(см. Последовательности клавиш). Аргумент binding может быть любым объектом Lisp, но значение имеют только объекты определённых типов. (Список значимых типов см. в разделе Поиск привязки клавиши.) Функцияkeymap-setвозвращает значение binding.Каждый префикс key должен быть префиксной клавишей (то есть быть привязан к карте клавиш) или не иметь определения; в противном случае сигнализируется ошибка. Если какой-либо префикс key не имеет определения,
keymap-setопределяет его как префиксную клавишу, чтобы оставшуюся часть key можно было определить указанным образом.Если ранее для key не было привязки в keymap, новая привязка добавляется в начало keymap. Порядок привязок в карте клавиш не влияет на ввод с клавиатуры, но имеет значение для карт клавиш меню (см. Карты клавиш меню).
- Функция: keymap-unset keymap key &optional remove
Эта функция является обратной к
keymap-set: она снимает привязку для key в keymap, что равносильно установке привязки вnil. Чтобы вместо этого полностью удалить привязку, укажите для remove значение, отличное отnil. Это имеет значение только в том случае, если у keymap есть родительская карта клавиш: если просто снять привязку клавиши в дочерней карте, она по-прежнему будет перекрывать ту же клавишу в родительской карте; использование remove вместо этого позволит использовать привязку клавиши из родительской карты.
Примечание: использование keymap-unset со значением remove, отличным от nil, предназначено для пользователей, которые добавляют это в свой файл инициализации; пакетам Emacs следует по возможности избегать такого использования, поскольку они и так полностью контролируют собственные карты клавиш и не должны изменять карты клавиш других пакетов.
В этом примере создаётся разреженная карта клавиш и задаётся ряд привязок в ней:
(setq map (make-sparse-keymap))
⇒ (keymap)
(keymap-set map "C-f" 'forward-char)
⇒ forward-char
map
⇒ (keymap (6 . forward-char))
;; Build sparse submap for C-x and bind f in that.
(keymap-set map "C-x f" 'forward-word)
⇒ forward-word
map
⇒ (keymap
(24 keymap ; C-x
(102 . forward-word)) ; f
(6 . forward-char)) ; C-f
;; Bind C-p to thectl-x-map. (keymap-set map "C-p" ctl-x-map) ;;ctl-x-map⇒ [nil ... find-file ... backward-kill-sentence]
;; Bind C-f to foo in the ctl-x-map.
(keymap-set map "C-p C-f" 'foo)
⇒ 'foo
map
⇒ (keymap ; Note foo in ctl-x-map.
(16 keymap [nil ... foo ... backward-kill-sentence])
(24 keymap
(102 . forward-word))
(6 . forward-char))
Обратите внимание: сохранение новой привязки для C-p C-f фактически изменяет запись в ctl-x-map, в результате чего меняются привязки как C-p C-f, так и C-x C-f в глобальной карте по умолчанию.
keymap-set — это универсальная основная функция для определения клавиши в карте клавиш. Однако при написании режимов часто приходится привязывать сразу много клавиш, и использовать keymap-set для каждой из них может быть утомительно и чревато ошибками. Вместо этого можно использовать define-keymap, которая создаёт карту клавиш и задаёт привязки для ряда клавиш. Подробности см. в разделе Создание карт клавиш.
Функция substitute-key-definition просматривает карту клавиш, находит клавиши с определённой привязкой и заменяет её другой. Более чистый подход, который часто позволяет получить тот же результат, — переназначить одну команду на другую (см. Переназначение команд).
- Функция: substitute-key-definition olddef newdef keymap &optional oldmap
-
Эта функция заменяет olddef на newdef для всех клавиш в keymap, привязанных к olddef. Другими словами, olddef заменяется на newdef во всех местах, где встречается. Функция возвращает
nil.Например, следующий код переопределяет C-x C-f, если выполнить его в Emacs со стандартными привязками:
(substitute-key-definition 'find-file 'find-file-read-only (current-global-map))
Если oldmap имеет значение, отличное от
nil, поведениеsubstitute-key-definitionменяется: привязки в oldmap определяют, какие клавиши нужно перепривязать. Перепривязки по-прежнему выполняются в keymap, а не в oldmap. Таким образом, можно изменить одну карту под управлением привязок другой. Например:(substitute-key-definition 'delete-backward-char 'my-funny-delete my-map global-map)
помещает специальную команду удаления в
my-mapдля всех клавиш, глобально привязанных к стандартной команде удаления.Ниже приведён пример карты клавиш до и после замены:
(setq map (list 'keymap (cons ?1 olddef-1) (cons ?2 olddef-2) (cons ?3 olddef-1))) ⇒ (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))(substitute-key-definition 'olddef-1 'newdef map) ⇒ nil
map ⇒ (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
- Функция: suppress-keymap keymap &optional nodigits
-
Эта функция изменяет содержимое полной карты клавиш keymap, переназначая
self-insert-commandна командуundefined(см. Переназначение команд). В результате все печатные символы становятся неопределёнными, что делает невозможной обычную вставку текста.suppress-keymapвозвращаетnil.Если nodigits имеет значение
nil, тоsuppress-keymapзадаёт для цифр запускdigit-argument, а для - — запускnegative-argument. В противном случае они становятся неопределёнными, как и остальные печатные символы.Функция
suppress-keymapне исключает возможности изменения буфера, поскольку она не подавляет такие команды, какyankиquoted-insert. Чтобы предотвратить любые изменения буфера, сделайте его доступным только для чтения (см. Буферы, доступные только для чтения).Поскольку эта функция изменяет keymap, обычно её следует применять к недавно созданной карте клавиш. Работа с существующей картой клавиш, используемой для других целей, скорее всего, приведёт к проблемам; например, подавление
global-mapсделает невозможным использование большей части Emacs.Эту функцию можно использовать для инициализации локальной карты клавиш основного режима, в котором вставка текста нежелательна. Однако обычно такой режим следует создавать на основе
special-mode(см. Основные основные режимы); тогда его карта клавиш автоматически унаследуетspecial-mode-map, в которой клавиши уже подавлены. Вот как определяетсяspecial-mode-map:(defvar special-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (keymap-set map "q" 'quit-window) ... map))
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Changing-Key-Bindings.html