Поиск по ключу
Поиск по ключу — это процесс поиска привязки последовательности нажатий клавиш из заданной раскладки. Выполнение или использование привязки не является частью поиска по ключу.
Поиск по ключу использует только тип события каждого события в последовательности нажатий; остальная часть события игнорируется. Фактически, последовательность нажатий клавиш, используемая для поиска по ключу, может обозначать событие мыши только своими типами (символ), а не всем событием (список). См. События ввода. Такая последовательность нажатий клавиш недостаточна для command-execute , но ее достаточно для поиска или перепривязки ключа.
Когда последовательность нажатий клавиш состоит из нескольких событий, поиск по ключу обрабатывает события последовательно: находится привязка первого события, и она должна быть раскладкой; затем привязка второго события находится в этой раскладке, и так далее, пока не будут использованы все события в последовательности нажатий. (Привязка, найденная таким образом для последнего события, может или не может быть раскладкой.) Таким образом, процесс поиска по ключу определяется в терминах более простого процесса поиска одного события в раскладке. Как это делается, зависит от типа объекта, связанного с событием в этой раскладке.
Давайте будем использовать термин элемент раскладки для описания значения, найденного при поиске типа события в раскладке. (Это не включает строку элемента и другие дополнительные элементы в элементе раскладки для пункта меню, потому что lookup-key и другие функции поиска по ключу не включают их в возвращаемое значение.) Хотя любой объект Lisp может храниться в раскладке как элемент раскладки, не все из них имеют смысл для поиска по ключу. Вот таблица значимых типов элементов раскладки:
nil-
nilозначает, что события, используемые до сих пор в процессе поиска, образуют неопределённый ключ. Когда раскладка вообще не упоминает тип события и не имеет стандартной привязки, это эквивалентно привязкеnilдля этого типа события. - команда
-
Используемые до сих пор события в процессе поиска образуют полный ключ, и команда является его привязкой. См. Что такое функция.
- массив
-
Массив (либо строка, либо вектор) — это макрос клавиатуры. События, используемые до сих пор в процессе поиска, образуют полный ключ, а массив является его привязкой. См. Макросы клавиатуры для получения дополнительной информации.
- раскладка
-
Используемые до сих пор события в процессе поиска образуют префиксный ключ. Следующее событие последовательности нажатий ищется в раскладке.
- список
-
Значение списка зависит от его содержимого:
- Если CAR списка является символом
keymap, то список является раскладкой и обрабатывается как раскладка (см. выше). - Если CAR списка является
lambda, то список является лямбда-выражением. Предполагается, что это функция, и она обрабатывается как таковая (см. выше). Для корректного выполнения в качестве привязки ключа эта функция должна быть командой — она должна иметь спецификациюinteractive. См. Определение команд.
- Если CAR списка является символом
- символ
-
Определение функции символа используется вместо символа. Если это тоже символ, то этот процесс повторяется любое количество раз. В конечном итоге это должно привести к объекту, который является раскладкой, командой или макросом клавиатуры.
Обратите внимание, что раскладки и макросы клавиатуры (строки и векторы) не являются допустимыми функциями, поэтому символ с раскладкой, строкой или вектором в качестве определения функции недопустим в качестве функции. Однако он допустим как привязка ключа. Если определение является макросом клавиатуры, то символ также допустим в качестве аргумента
command-execute(см. Интерактивный вызов).Символ
undefinedзаслуживает особого упоминания: он означает, что ключ следует рассматривать как неопределённый. Строго говоря, ключ определён, а его привязкой является командаundefined; но эта команда делает то же, что делается автоматически для неопределённого ключа: она звонит в колокольчик (вызываяding), но не сигнализирует об ошибке.undefinedиспользуется в локальных раскладках, чтобы переопределить глобальную привязку ключа и сделать ключ локально неопределённым. Локальная привязкаnilне смогла бы сделать этого, потому что не переопределила бы глобальную привязку. - любой другой тип
Если найден любой другой тип объекта, то события, используемые до сих пор в процессе поиска, образуют полный ключ, а объект является его привязкой, но привязка не может быть выполнена как команда.
Короче говоря, элемент раскладки может быть раскладкой, командой, макросом клавиатуры, символом, ведущим к одному из них, или nil.
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/Key-Lookup.html