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

В большинстве мест, где используются строки, мы рассматриваем строку как содержащую текстовые символы — те же самые символы, которые встречаются в буферах или файлах. Иногда программы на 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 представляли метасимволы как коды в диапазоне от 128 до 255. В то время базовые коды символов варьировались от 0 до 127, поэтому все коды символов клавиатуры помещались в строку. Многие программы на Lisp использовали «\M-» в строковых константах для обозначения метасимволов, особенно в аргументах функций define-key и аналогичных, и последовательности клавиш и последовательности событий всегда представлялись в виде строк.

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

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

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

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

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