Spec-Zone.ru › Elisp

Сканирование карт клавиш

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

Spec-Zone.ru

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