Spec-Zone.ru › Elisp

Ввод событий клавиатуры в строки

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

Мы рекомендуем новым программам избегать этих сложностей, не храня события клавиатуры в строках. Вот как это сделать:

  • Используйте векторы вместо строк для последовательностей клавиш, если вы планируете использовать их для чего-либо, кроме аргументов lookup-key и define-key. Например, вы можете использовать read-key-sequence-vector вместо read-key-sequence, и this-command-keys-vector вместо this-command-keys.
  • Используйте векторы для записи констант последовательностей клавиш, содержащих мета-символы, даже при их непосредственном передаче в define-key.
  • Когда вам нужно посмотреть содержимое последовательности клавиш, которая может быть строкой, сначала используйте listify-key-sequence (см. Дополнительные сведения о вводе событий), чтобы преобразовать её в список.

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

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

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

Для поддержки программ со строковыми константами «\M-» существуют специальные правила включения определённых мета-символов в строку. Вот правила интерпретации строки как последовательности символов ввода:

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

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

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

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

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/Strings-of-Events.html

Spec-Zone.ru

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