Сканирование карт клавиш
В этом разделе описаны функции, используемые для сканирования всех текущих карт клавиш с целью вывода справочной информации. Чтобы отобразить привязки в определённой карте клавиш, можно использовать команду describe-keymap (см. Другие команды справки в Руководстве GNU Emacs)
- Функция: accessible-keymaps keymap &optional prefix
-
Эта функция возвращает список всех карт клавиш, до которых можно добраться (с помощью нуля или более префиксных клавиш) из keymap. Значение представляет собой ассоциативный список с элементами вида
(key . map), где key — это префиксная клавиша, определение которой в keymap — map.Элементы списка упорядочены так, что длина key возрастает. Первый элемент всегда равен
([] . keymap), поскольку указанная карта клавиш доступна из самой себя с префиксом, состоящим из нуля событий.Если задан prefix, он должен быть последовательностью префиксных клавиш; в этом случае
accessible-keymapsвключает только подкарты, префиксы которых начинаются с prefix. Эти элементы выглядят так же, как в значении(accessible-keymaps); разница лишь в том, что некоторые элементы опущены.В приведённом ниже примере возвращённый список показывает, что клавиша ESC, отображаемая как «^[», является префиксной клавишей, определение которой — разреженная карта клавиш
(keymap (83 . center-paragraph) (115 . foo)).(accessible-keymaps (current-local-map)) ⇒(([] keymap (27 keymap ; Note this keymap for ESC is repeated below. (83 . center-paragraph) (115 . center-line)) (9 . tab-to-tab-stop))("^[" keymap (83 . center-paragraph) (115 . foo)))В следующем примере C-h — это префиксная клавиша, использующая разреженную карту клавиш, начинающуюся с
(keymap (118 . describe-variable)…). Другой префикс, C-x 4, использует карту клавиш, которая также является значением переменнойctl-x-4-map. Событиеmode-line— одно из нескольких фиктивных событий, используемых в качестве префиксов для действий мыши в специальных областях окна.(accessible-keymaps (current-global-map)) ⇒ (([] keymap [set-mark-command beginning-of-line ... delete-backward-char])("^H" keymap (118 . describe-variable) ... (8 . help-for-help))("^X" keymap [x-flush-mouse-queue ... backward-kill-sentence])("^[" keymap [mark-sexp backward-sexp ... backward-kill-word])("^X4" keymap (15 . display-buffer) ...)([mode-line] keymap (S-mouse-2 . mouse-split-window-horizontally) ...))В действительности вы увидели бы не все эти карты клавиш.
- Функция: map-keymap function keymap
-
Функция
map-keymapвызывает function один раз для каждой привязки в keymap. Она передаёт два аргумента: тип события и значение привязки. Если у keymap есть родительская карта, также включаются привязки родительской карты. Это работает рекурсивно: если у родительской карты есть собственная родительская карта, включаются также привязки карты-прародителя и так далее.Эта функция — самый простой способ просмотреть все привязки в карте клавиш.
- Функция: where-is-internal command &optional keymap firstonly noindirect no-remap
-
Эта функция является подпрограммой, используемой командой
where-is(см. Справка в Руководстве GNU Emacs). Она возвращает список всех последовательностей клавиш (любой длины), связанных с command в наборе карт клавиш.Аргумент command может быть любым объектом; он сравнивается со всеми элементами карт клавиш с помощью
eq.Если keymap равен
nil, используются текущие активные карты клавиш без учётаoverriding-local-map(то есть предполагается, что его значение равноnil). Если keymap — это карта клавиш, поиск выполняется в keymap и глобальной карте клавиш. Если keymap — список карт клавиш, поиск выполняется только в этих картах клавиш.Обычно лучше всего использовать
overriding-local-mapв качестве выражения для keymap. Тогдаwhere-is-internalвыполняет поиск именно в активных картах клавиш. Чтобы выполнить поиск только в глобальной карте, передайте значение(keymap)(пустую карту клавиш) в качестве keymap.Если firstonly равен
non-ascii, значением будет один вектор, представляющий первую найденную последовательность клавиш, а не список всех возможных последовательностей клавиш. Если firstonly равенt, значением будет первая последовательность клавиш, за исключением того, что последовательности, состоящие только из символов ASCII (или их мета-вариантов), имеют приоритет над всеми остальными последовательностями клавиш, а возвращаемое значение никогда не может быть привязкой меню.Если noindirect не равен
nil,where-is-internalне заглядывает внутрь элементов меню, чтобы найти связанные с ними команды. Это позволяет выполнить поиск самого элемента меню.Пятый аргумент, no-remap, определяет, как эта функция обрабатывает переназначения команд (см. Переназначение команд). Представляют интерес два случая:
- Если команда other-command переназначена на command:
-
Если no-remap равен
nil, найдите привязки для other-command и рассматривайте их так, как если бы они также были привязками для command. Если no-remap не равенnil, включите в список возможных последовательностей клавиш вектор[remap other-command]вместо поиска этих привязок. - Если command переназначена на other-command:
Если no-remap равен
nil, верните привязки для other-command, а не для command. Если no-remap не равенnil, верните привязки для command, игнорируя факт её переназначения.
Если команда связана с привязкой клавиш вроде
[some-event]иsome-eventимеет список свойств символа, содержащий свойствоnon-key-eventс ненулевым значениемnil, тоwhere-is-internalигнорирует эту привязку.
- Команда: describe-bindings &optional prefix buffer-or-name
-
Эта функция создаёт список всех текущих привязок клавиш и отображает его в буфере с именем *Help*. Текст сгруппирован по режимам: сначала второстепенные режимы, затем основной режим, а после него глобальные привязки.
Если prefix не равен
nil, он должен быть префиксной клавишей; в этом случае в список включаются только клавиши, начинающиеся с prefix.Если несколько символов с последовательными кодами ASCII имеют одно и то же определение, они отображаются вместе в виде «firstchar..lastchar». В этом случае, чтобы понять, какие символы имеются в виду, нужно знать коды ASCII. Например, в глобальной карте по умолчанию символы «SPC .. ~» описаны одной строкой. SPC — это ASCII 32, ~ — это ASCII 126, а символы между ними включают все обычные печатные символы (например, буквы, цифры, знаки препинания и т. д.); все эти символы связаны с
self-insert-command.Если buffer-or-name не равен
nil, он должен быть буфером или именем буфера. В таком случаеdescribe-bindingsвыводит привязки указанного буфера вместо привязок текущего буфера.
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/Scanning-Keymaps.html