Вы можете настроить преобразование регистра, установив специальную таблицу регистра. Таблица регистра определяет соответствие между заглавными и строчными буквами. Она влияет как на функции преобразования регистра для объектов Lisp (см. предыдущий раздел), так и на те, которые применяются к тексту в буфере (см. Изменения регистра). Каждый буфер имеет таблицу регистра; также существует стандартная таблица регистра, используемая для инициализации таблицы регистра новых буферов.
Таблица регистра — это таблица символов (см. Таблицы символов), подтип которой — case-table. Эта таблица символов отображает каждый символ в соответствующий строчный символ. Она имеет три дополнительных слота, в которых хранятся связанные таблицы:
Таблица upcase отображает каждый символ в соответствующий заглавный символ.
Таблица canonicalize отображает все символы из набора, связанных по регистру, в определенный член этого набора.
Таблица equivalences отображает каждый из набора символов, связанных по регистру, в следующий символ в этом наборе.
В простых случаях вам достаточно указать только отображение в строчные буквы; три связанные таблицы будут рассчитаны автоматически на основе этой.
Для некоторых языков заглавные и строчные буквы не находятся в одном-к-одному соответствии. Может существовать две разные строчные буквы с одинаковым заглавным эквивалентом. В таких случаях вам необходимо указать отображения как для строчных, так и для заглавных букв.
Некоторые символы имеют определенные правила преобразования регистра, которые по умолчанию переопределяют текущую таблицу регистра. Эти символы имеют не-nil свойства символов special-uppercase, special-lowercase или special-titlecase (см. Свойства символов), определенные Стандартом Unicode. Примером является U+00DF LATIN SMALL LETTER SHARP S, ß, который по умолчанию преобразуется в строку "SS", а не в U+1E9E LATIN CAPITAL LETTER SHARP S. Чтобы заставить эти символы следовать преобразованиям таблицы регистра, установите соответствующее свойство Unicode в nil:
(upcase "ß") => "SS" (put-char-code-property ?ß 'special-uppercase nil) (upcase "ß") => "ẞ"
Дополнительный слот canonicalize таблицы регистра отображает каждый символ в канонический эквивалент; любые два символа, связанные преобразованием регистра, имеют одинаковый канонический эквивалент. Например, поскольку ‘a’ и ‘A’ связаны преобразованием регистра, они должны иметь одинаковый канонический эквивалент (который должен быть либо ‘a’ для обоих, либо ‘A’ для обоих).
Дополнительный слот equivalences — это отображение, которое циклически переставляет каждый класс эквивалентности (символов с одинаковым каноническим эквивалентом). (Для обычного ASCII это отображение преобразует ‘a’ в ‘A’ и ‘A’ в ‘a’, и аналогично для каждого набора эквивалентных символов.)
При построении таблицы регистра вы можете предоставить nil для canonicalize; тогда Emacs автоматически заполняет этот слот на основе отображений в нижний и верхний регистр. Вы также можете предоставить nil для equivalences; тогда Emacs заполняет этот слот на основе canonicalize. В таблице регистра, которая фактически используется, эти компоненты не равны nil. Не пытайтесь указать equivalences без указания canonicalize.
Ниже приведены функции для работы с таблицами регистра:
Этот предикат возвращает не-nil, если object является допустимой таблицей регистра.
Эта функция делает table стандартной таблицей регистра, так что она будет использоваться во всех последующих созданных буферах.
Эта функция возвращает стандартную таблицу регистра.
Эта функция возвращает таблицу регистра текущего буфера.
Эта функция устанавливает таблицу регистра текущего буфера в table.
Макрос with-case-table сохраняет текущую таблицу регистра, устанавливает table в качестве текущей таблицы регистра, вычисляет формы body, а затем восстанавливает таблицу регистра. Возвращаемое значение — это значение последней формы в body. Таблица регистра восстанавливается даже в случае аномального выхода через throw или ошибку (см. Нелокальные выходы).
Некоторые языковые среды изменяют преобразования регистра символов ASCII; например, в среде турецкого языка заглавная I ASCII преобразуется в турецкую i без точки (‘ı’). Это может мешать коду, который требует обычного преобразования регистра ASCII, например, реализациям сетевых протоколов на основе ASCII. В этом случае используйте макрос with-case-table с переменной ascii-case-table, которая хранит неизмененную таблицу регистра для набора символов ASCII.
Таблица регистра для набора символов ASCII. Она не должна изменяться настройками языковой среды.
Следующие три функции являются удобными подпрограммами для пакетов, определяющих не-ASCII наборы символов. Они изменяют указанную таблицу регистра case-table; они также изменяют стандартную синтаксическую таблицу. См. Синтаксические таблицы. Обычно вы используете эти функции для изменения стандартной таблицы регистра.
Эта функция указывает пару соответствующих букв: одну заглавную и одну строчную.
Эта функция делает символы l и r совпадающей парой разделителей, инвариантных к регистру.
Эта функция делает char инвариантным к регистру с синтаксисом syntax.
Эта команда отображает описание содержимого таблицы регистра текущего буфера.