Сканирование раскладок клавиш
В этом разделе описаны функции, используемые для сканирования всех текущих раскладок клавиш с целью вывода справочной информации. Чтобы отобразить привязки в определенной раскладке клавиш, вы можете использовать команду 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 (или мета-вариантов символов 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, игнорируя тот факт, что она переопределена.
- Команда: 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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Scanning-Keymaps.html