Ввод событий клавиатуры в строки
В большинстве мест, где используются строки, мы представляем строку как содержащую символы текста — тот же вид символов, что и в буферах или файлах. Иногда программы 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