Поиск по ключу — это процесс нахождения привязки последовательности клавиш из заданной карты клавиш. Выполнение или использование этой привязки не является частью поиска по ключу.
Поиск по ключу использует только тип события каждого события в последовательности клавиш; остальная часть события игнорируется. Фактически, последовательность клавиш, используемая для поиска по ключу, может обозначать событие мыши только его типами (символом) вместо всего события (списком). См. События ввода. Такая последовательность клавиш недостаточна для выполнения command-execute, но достаточна для поиска или перепривязки клавиши.
Когда последовательность клавиш состоит из нескольких событий, поиск по ключу обрабатывает события последовательно: находится привязка первого события, и она должна быть картой клавиш; затем в этой карте клавиш находится привязка второго события и так далее, пока не будут использованы все события в последовательности клавиш. (Таким образом, найденная привязка для последнего события может быть или не быть картой клавиш.) Следовательно, процесс поиска по ключу определяется с точки зрения более простого процесса поиска одного события в карте клавиш. То, как это делается, зависит от типа объекта, связанного с событием в этой карте клавиш.
Давайте будем использовать термин запись карты клавиш для описания значения, найденного при поиске типа события в карте клавиш. (Это не включает строковый элемент и другие дополнительные элементы в элементе карты клавиш для пункта меню, потому что keymap-lookup и другие функции поиска по ключу не включают их в возвращаемое значение.) Хотя любой объект Lisp может быть сохранен в карте клавиш как запись карты клавиш, не все они имеют смысл для поиска по ключу. Вот таблица значимых типов записей карты клавиш:
nil ¶nil означает, что события, использованные до сих пор в поиске, образуют неопределенный ключ. Когда карта клавиш вообще не упоминает тип события и не имеет значения по умолчанию, это эквивалентно привязке nil для этого типа события.
События, использованные до сих пор в поиске, образуют полный ключ, и command является его привязкой. См. Что такое функция?.
Массив (строка или вектор) — это клавиатурный макрос. События, использованные до сих пор в поиске, образуют полный ключ, и массив является его привязкой. См. Клавиатурные макросы, для получения дополнительной информации.
События, использованные до сих пор в поиске, образуют префиксный ключ. Следующее событие последовательности клавиш ищется в keymap.
Значение списка зависит от его содержимого:
keymap, то список является картой клавиш и рассматривается как такая (см. выше).
lambda, то список является лямбда-выражением. Предполагается, что это функция, и она рассматривается как такая (см. выше). Чтобы правильно выполниться в качестве привязки клавиши, эта функция должна быть командой — она должна иметь спецификацию interactive. См. Определение команд.
Функция определения symbol используется вместо symbol. Если и это символ, то этот процесс повторяется, любое количество раз. В конечном итоге это должно привести к объекту, который является картой клавиш, командой или клавиатурным макросом.
Обратите внимание, что карты клавиш и клавиатурные макросы (строки и векторы) не являются действительными функциями, поэтому символ с картой клавиш, строкой или вектором в качестве функции определения является недопустимым как функция. Однако он допустим как привязка клавиши. Если определение является клавиатурным макросом, то символ также допустим как аргумент для command-execute (см. Интерактивный вызов).
Символ undefined заслуживает особого упоминания: он означает рассматривать ключ как неопределенный. Строго говоря, ключ определен, и его привязка — это команда undefined; но эта команда делает то же самое, что и происходит автоматически для неопределенного ключа: она издает звонок (вызывая ding), но не сигнализирует об ошибке.
undefined используется в локальных картах клавиш для переопределения глобальной привязки клавиши и локального определения ключа как неопределенного. Локальная привязка nil не сможет этого сделать, потому что она не переопределит глобальную привязку.
Если найден любой другой тип объекта, события, использованные до сих пор в поиске, образуют полный ключ, и объект является его привязкой, но привязка не может быть выполнена как команда.
Короче говоря, запись карты клавиш может быть картой клавиш, командой, клавиатурным макросом, символом, ведущим к одному из них, или nil.