Spec-Zone.ru › Elisp

Изменение привязок клавиш

Чтобы изменить привязку клавиши, нужно изменить её запись в карте клавиш. Если изменить привязку в глобальной карте клавиш, изменение вступит в силу во всех буферах (хотя оно не окажет прямого влияния на буферы, в которых глобальная привязка перекрыта локальной). Если изменить локальную карту текущего буфера, это обычно затронет все буферы, использующие тот же основной режим. Функции 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 the ctl-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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API