Разнообразные команды – ЧАСТЬ 12

Другой способ изменить поведение клавиатурного макроса — использовать в качестве счетчика регистр, увеличивая его при каждом повторе макроса. См. Раздел 10.5 [РегЧисла], с. 78.

31.4  Настройка привязок ключей

Этот  раздел описывает привязки ключей, которые отображают ключи в команды, и таблицы ключей, которые сохраняют привязки.  Здесь также  объясняется, как изменять привязки ключей для своих нужд.

Напомним, что команда — это функция Лиспа, чье определение обеспечивает интерактивное использование.  Подобно любой лисповской функции, каждая команда имеет имя, которое обычно состоит из букв нижнего регистра и дефисов.

31.4.1  Таблицы ключей

Привязки между последовательностями ключей и функциями-командами сохраняются в структурах данных, называемых таблицами ключей. В Emacs много таких таблиц, каждая из которых используется в особых случаях.

Напомним, что последовательность ключей (или коротко, ключ) — это последовательность событий ввода, которая имеет смысл как одно целое. События ввода включают в себя знаки, функциональные клавиши и кнопки мыши — все виды ввода, какие вы можете послать компьютеру с вашего терминала. Последовательность ключей получает свой смысл из привязки, которая говорит, какую команду данный ключ запускает. Назначение таблиц ключей состоит в сохранении этих привязок.

Глобальная таблица ключей является наиболее важной, потому что она действует всегда. Глобальная таблица определяет ключи для режима Fundamental; большинство из этих определений являются общими для всех основных режимов. Каждый основной или второстепенный режим может иметь свою собственную таблицу ключей, которая перекрывает глобальные определения некоторых ключей.

Например, самовставляющийся  знак, такой как  g, является самовставляющимся,  потому что глобальная таблица ключей привязывает его к команде  self-insert-command. Стандартные знаки редактирования в Emacs, такие как C-a, также получают свой стандартный смысл из глобальной таблицы ключей. Команды для перепривязки ключей, такие как M-x global-set-key, на самом деле работают путем сохранения новой привязки в соответствующем месте глобальной таблицы ключей.  См.  Раздел 31.4.5 [Перепривязка], с. 359.

Meta-знаки работают по другому; Emacs транслирует каждый Meta-знак в пары знаков, начинающиеся с hESCi.  Когда вы набираете знак M-a, Emacs  заменяет  ее на hESCa. Metaклавиша приходит как одиночное событие ввода, но для целей привязки ключей становится двумя событиями. Это происходит по историческим причинам, и мы можем когда-нибудь это изменить.

На большинстве современных клавиатур помимо знаковых клавиш есть функциональные клавиши.  Функциональные клавиши посылают события ввода, точно так же,  как и знаковые клавиши, и таблицы ключей могут содержать привязки для них.

На многих терминалах нажатие на функциональную клавишу в действительности посылает компьютеру последовательность знаков; точная информация о том, что это за последовательность,  зависит от самой функциональной клавиши и от того,  какую  модель терминала вы используете.  (Часто такая последовательность начинается  с hESC[.)   Если Emacs понимает ваш тип терминала правильно, то он распознает последовательности знаков, формирующие функциональные  клавиши, в каком бы месте последовательности ключей они не встречались  (не только в начале). Таким образом, для большинства целей вы можете считать, что функциональные клавиши достигают Emacs непосредственно, и игнорировать их кодирование как последовательность знаков.

Кнопки мыши также производят события ввода. Эти события приносят другую информацию — окно и позицию, где  была нажата или отпущена кнопка мыши, и временную метку.  Но для привязок ключей важно лишь знать кнопку; другие данные играют роль, только если это нужно команде.  (Команды, разработанные для вызова с помощью мыши, на самом деле обычно обращают  внимание на эти данные).

Таблица ключей записывает определения для одиночных событий. Для интерпретации последовательности  ключей, состоящей из нескольких событий, нужна  цепочка таблиц ключей.  Первая таблица дает определение  первого события; это определение  является другой таблицей ключей, которая используется для поиска второго события в последовательности, и так далее.

Последовательность ключей может содержать нажатия на функциональные и знаковые клавиши. Например, C-x hSELECTi  имеет смысл. Если вы сделаете клавишу hSELECTi  префиксным ключом, то hSELECTC-n тоже будет иметь смысл. Вы даже можете смешивать события от мыши с событиями от клавиатуры, но мы не рекомендуем делать так, потому что такие последовательности неудобно набирать.

Как  пользователь  вы можете  перепривязать  любой ключ;  но будет лучше,  если вы всегда будете использовать  последовательности  ключей, состоящие из C-c, за которым следует буква. Эти клавиши “зарезервированы для пользователей”, так что они не будут конфликтовать ни с одним правильно спроектированным  расширением Emacs. Функциональные клавиши от hF5i  до hF9i  также  зарезервированы для пользователей. Если вы перепривязываете какой-то другой ключ, ваше определение может быть перекрыто некоторыми расширениями или основными режимами, которые переопределяют тот же самый ключ.

31.4.2  Таблицы префиксных ключей

Префиксный ключ, такой как C-x или hESCi, имеют собственную таблицу ключей, кото-

рая хранит определения для событий, непосредственно следующих за этим префиксом.

Определение  префиксного ключа — это обычно таблица ключей, в которой ищется следующее событие. Это определение также может быть лисповским символом, чье определение функции является следующей таблицей ключей; результат этого тот же  самый, но он предоставляет для префиксного ключа командное имя, которое может быть использовано как описание того, для чего предназначен этот префиксный ключ. Таким образом, привязка C-x — это символ Ctl-X-Prefix,  чье определение функции является таблицей ключей для команд на C-x.  Определения C-c, C-x, C-h и hESCi  как префиксных ключей появляются в глобальной таблице, так что эти префиксные ключи доступны всегда.

Помимо обычных префиксных ключей существуют фиктивные “префиксные  ключи”, которые представляют полоску меню; смотрите раздел “Menu Bar” в The Emacs Lisp Reference Manual, для дополнительной информации о привязках ключей полоски меню. События от кнопок мыши, которые запускают всплывающие меню, также являются префиксными

ключами; смотрите раздел “Menu Keymaps” в The Emacs Lisp Reference Manual, для до-

полнительной информации.

Некоторые таблицы префиксных ключей хранятся в именованных переменных:

•  ctl-x-map — это имя переменной для таблицы, используемой для знаков, следующих за C-x.

help-map для знаков, следующих за C-h.

esc-map для знаков, следующих  за hESCi.  Таким образом, все Meta-знаки в действи-

тельности определяются этой таблицей.

ctl-x-4-map для знаков, следующих за C-x 4.

mode-specific-map для знаков, следующих за C-c.

31.4.3  Локальные таблицы ключей

До сих пор мы объясняли принципы работы глобальной таблицы. Основные режимы настраивают Emacs, предоставляя  собственные привязки ключей в локальных таблицах ключей. Например, режим C переопределяет hTABi  для создания отступа текущей строки кода на Си.  Куски  текста в буфере могут указывать свои собственные таблицы ключей взамен таблицы основного режима этого буфера.

Второстепенные режимы также могут иметь локальные таблицы ключей. Когда действует второстепенный  режим, определения  из его таблицы ключей перекрывают и локальную таблицу основного режима, и глобальную таблицу.

Локальные таблицы ключей для режима Lisp и некоторых других основных режимов всегда существуют, даже когда не используются. Они хранятся в переменных с именами lisp-mode-map и так далее.  Для менее часто используемых основных режимов локальная таблица ключей обычно создается при первом использовании в сеансе.  Это сберегает ресурсы. Если вы хотите изменить одну из этих таблиц ключей, то вы должны использовать ловушку режима — смотрите ниже.

Все таблицы ключей второстепенных режимов создаются заранее. Не существует способа задержать их создание до тех пор, пока этот второстепенный режим не будет включен первый раз.

Локальная таблица ключей может локально переопределять  ключ  как  префиксный, определяя его как префиксную таблицу ключей. Если этот ключ определен как префикс и в глобальной таблице, то его локальное и глобальное определения (из обоих таблиц ключей) эффективно комбинируется: обе они используются для поиска события, которое следует за префиксным ключом. Таким образом, если локальная таблица ключей определяет C-c как еще одну таблицу ключей, а эта таблица определяет C-z как команду, то это придает локальный смысл для C-c C-z.  Это не затрагивает другие последовательности, которые начинаются с C-c; если у этих последовательностей нет собственной локальной привязки, то продолжают действовать глобальные привязки.

Другой  способ понять это — считать,  что  Emacs обрабатывает  последовательности ключей, состоящие из нескольких событий, просматривая несколько таблиц ключей одну за одной в поисках этой последовательности  целиком.  Сначала он проверяет таблицы ключей текущих  второстепенных режимов, затем таблицу ключей основного режима и затем он ищет в глобальной  таблице.  Это не совсем точно описывает то, как работает поиск, но достаточно хорошо для понимания обычного положения дел.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий