Поиск в активных раскладках
Вот псевдо-Lisp-резюме, как Emacs ищет в активных раскладках:
(or (if overriding-terminal-local-map
(find-in overriding-terminal-local-map))
(if overriding-local-map
(find-in overriding-local-map)
(or (find-in (get-char-property (point) 'keymap))
(find-in-any emulation-mode-map-alists)
(find-in-any minor-mode-overriding-map-alist)
(find-in-any minor-mode-map-alist)
(if (get-text-property (point) 'local-map)
(find-in (get-char-property (point) 'local-map))
(find-in (current-local-map)))))
(find-in (current-global-map)))
Здесь, find-in и find-in-any — это псевдо-функции, которые ищут в одной раскладке и в списке раскладок соответственно. Обратите внимание, что функция set-transient-map работает, устанавливая overriding-terminal-local-map (см. Управление активными раскладками).
В приведенном псевдокоде, если последовательность клавиш начинается с события мыши (см. События мыши), используется положение этого события вместо текущей позиции, а буфер события вместо текущего буфера. В частности, это влияет на то, как ищут свойства keymap и local-map. Если событие мыши происходит на строке, содержащей свойство display, before-string, или after-string (см. Специальные свойства), и строка имеет не-nil keymap или local-map свойство, это свойство переопределяет соответствующее свойство в тексте основного буфера (т.е. свойство, указанное основным текстом, игнорируется).
Когда связанная команда найдена в одной из активных раскладок, поиск завершается — команда выполняется. Однако, если связь — символ со значением или строка, Emacs заменяет последовательности вводимых клавиш на значение переменной или строку и перезапускает поиск в активных раскладках. См. Поиск клавиш.
Команда, которая в конечном итоге найдена, также может быть переназначена. См. Переназначение команд.
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/Searching-Keymaps.html