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 (или мета-вариантов символов 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

Spec-Zone.ru

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