Spec-Zone.ru › Elisp

Помещение событий клавиатуры в строки

В большинстве случаев, когда используются строки, мы рассматриваем строку как содержащую текстовые символы — такие же, как в буферах или файлах. Иногда программы на Lisp используют строки, которые концептуально содержат символы клавиатуры; например, это могут быть последовательности клавиш или определения клавиатурных макросов. Однако хранение символов клавиатуры в строке — сложная задача из-за исторической совместимости, и это не всегда возможно.

Мы рекомендуем новым программам избегать этих сложностей: не хранить события клавиатуры в строках, содержащих управляющие символы и тому подобное, а вместо этого хранить их в распространённом формате Emacs, понятном для key-valid-p.

Если вы считываете последовательность клавиш с помощью read-key-sequence-vector (или read-key-sequence) либо получаете к ней доступ с помощью this-command-keys-vector (или this-command-keys), вы можете преобразовать её в рекомендуемый формат с помощью key-description.

Эти сложности связаны с битами модификаторов, которые могут включать символы клавиатурного ввода. За исключением модификатора Meta, ни один из этих битов модификаторов не может быть включён в строку, а модификатор Meta допускается только в особых случаях.

В самых ранних версиях GNU Emacs символы Meta представлялись кодами в диапазоне от 128 до 255. В то время базовые коды символов находились в диапазоне от 0 до 127, поэтому все коды символов клавиатуры помещались в строку. Во многих программах на Lisp для обозначения символов Meta в строковых константах использовалась последовательность ‘\M-’, особенно в аргументах функций define-key и подобных; последовательности клавиш и последовательности событий всегда представлялись строками.

Когда мы добавили поддержку базовых кодов символов больше 127 и дополнительных битов модификаторов, нам пришлось изменить представление символов Meta. Теперь флаг, представляющий модификатор Meta в символе, равен 2**27, а такие числа нельзя включить в строку.

Чтобы поддерживать программы со строковыми константами, содержащими ‘\M-’, существуют особые правила включения определённых символов Meta в строку. Ниже приведены правила интерпретации строки как последовательности символов ввода:

  • Если значение символа клавиатуры находится в диапазоне от 0 до 127, его можно без изменений поместить в строку.
  • Варианты этих символов с модификатором Meta, коды которых находятся в диапазоне от 2**27 до 2**27+127, также можно поместить в строку, но для этого необходимо изменить их числовые значения. Вместо бита 2**27 нужно установить бит 2**7, в результате получится значение от 128 до 255. Эти коды можно включать только в однобайтную строку.
  • Символы, отличные от ASCII, с кодами больше 256 можно включать в многобайтную строку.
  • Другие события клавиатуры нельзя поместить в строку. К ним относятся события клавиатуры в диапазоне от 128 до 255.

Такие функции, как read-key-sequence, которые создают строки из символов клавиатурного ввода, следуют этим правилам: если события не помещаются в строку, они создают вектор.

Когда вы используете в строке синтаксис чтения ‘\M-’, он создаёт код в диапазоне от 128 до 255 — тот же код, который получается при изменении соответствующего события клавиатуры для его включения в строку. Таким образом, события Meta в строках обрабатываются согласованно независимо от того, каким образом они попали в строки.

Тем не менее большинству программ будет проще избежать этих проблем, следуя рекомендациям в начале этого раздела.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Strings-of-Events.html

Spec-Zone.ru

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