Изменение сочетаний клавиш
Чтобы переназначить сочетание клавиш, нужно изменить его запись в ключевой карте. Если вы измените сочетание в глобальной ключевой карте, это изменение вступит в силу во всех буферах (хотя оно не повлияет на буферы, которые затеняют глобальное сочетание локальным). Если вы измените локальную карту текущего буфера, это обычно повлияет на все буферы, использующие тот же основной режим. Функции global-set-key и local-set-key являются удобными интерфейсами для этих операций (см. Команды привязки сочетаний клавиш). Вы также можете использовать define-key, более общую функцию; тогда вам нужно явно указать карту для изменения.
При выборе последовательностей клавиш для переназначения в программах Lisp, пожалуйста, следуйте соглашениям Emacs для использования различных клавиш (см. Соглашения о привязке сочетаний клавиш).
При написании последовательности клавиш для переназначения, рекомендуется использовать специальные управляющие последовательности для символов управления и мета-символов (см. Тип строки). Синтаксис ‘\C-’ означает, что следующий символ является управляющим символом, а ‘\M-’ означает, что следующий символ является мета-символом. Таким образом, строка "\M-x" читается как содержащая одну M-x, "\C-f" читается как содержащая одну C-f, а "\M-\C-x" и "\C-\M-x" обе читаются как содержащие одну C-M-x. Вы также можете использовать этот синтаксис в векторах, а также в других, которые недопустимы в строках; одним примером является ‘[?\C-\H-x home]’. См. Тип символа.
Функции определения и поиска сочетаний клавиш принимают альтернативный синтаксис для типов событий в последовательности клавиш, которая является вектором: вы можете использовать список, содержащий имена модификаторов плюс одно базовое событие (символ или имя функциональной клавиши). Например, (control ?a) эквивалентно ?\C-a и (hyper control left) эквивалентно C-H-left. Одним из преимуществ таких списков является то, что точные числовые коды для битов модификатора не отображаются в скомпилированных файлах.
Нижеприведенные функции сигнализируют об ошибке, если keymap не является ключевой картой, или если key не является строкой или вектором, представляющим последовательность клавиш. Вы можете использовать типы событий (символы) как сокращение для событий, которые являются списками. Функция kbd (см. Последовательности клавиш) является удобным способом указания последовательности клавиш.
- Функция: define-key keymap key binding
-
Эта функция устанавливает привязку для key в keymap. (Если key состоит более чем из одного события, изменение фактически выполняется в другой ключевой карте, достижимой из keymap.) Аргумент binding может быть любым объектом Lisp, но только определенные типы имеют смысл. (Список значимых типов см. в Поиск сочетаний клавиш.) Значение, возвращаемое
define-key, равно binding.Если key равно
[t], это устанавливает стандартную привязку в keymap. Когда у события нет собственной привязки, цикл команд Emacs использует стандартную привязку ключевой карты, если она существует.Каждый префикс key должен быть префиксной клавишей (т.е. связанной с ключевой картой) или не определён; в противном случае сигнализируется об ошибке. Если какой-либо префикс key не определен, тогда
define-keyопределяет его как префиксную клавишу, чтобы остальную часть key можно было определить, как указано.Если ранее в keymap не было привязки для key, новая привязка добавляется в начало keymap. Порядок привязок в ключевой карте не имеет значения для ввода с клавиатуры, но он имеет значение для ключевых карт меню (см. Ключевые карты меню).
Этот пример создает разреженную ключевую карту и выполняет ряд привязок в ней:
(setq map (make-sparse-keymap))
⇒ (keymap)
(define-key map "\C-f" 'forward-char)
⇒ forward-char
map
⇒ (keymap (6 . forward-char))
;; Build sparse submap for C-x and bind f in that.
(define-key map (kbd "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. (define-key map (kbd "C-p") ctl-x-map) ;;ctl-x-map⇒ [nil … find-file … backward-kill-sentence]
;; Bind C-f to foo in the ctl-x-map.
(define-key map (kbd "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 в глобальной стандартной карте.
Функция 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) (define-key map "q" 'quit-window) … map))
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Changing-Key-Bindings.html