4.10 Таблица регистра

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

Таблица регистра — это таблица символов (см. Таблицы символов), подтип которой — case-table. Эта таблица символов отображает каждый символ в соответствующий строчный символ. Она имеет три дополнительных слота, в которых хранятся связанные таблицы:

upcase

Таблица upcase отображает каждый символ в соответствующий заглавный символ.

canonicalize

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

equivalences

Таблица 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.

Ниже приведены функции для работы с таблицами регистра:

Функция: case-table-p object

Этот предикат возвращает не-nil, если object является допустимой таблицей регистра.

Функция: set-standard-case-table table

Эта функция делает table стандартной таблицей регистра, так что она будет использоваться во всех последующих созданных буферах.

Функция: standard-case-table

Эта функция возвращает стандартную таблицу регистра.

Функция: current-case-table

Эта функция возвращает таблицу регистра текущего буфера.

Функция: set-case-table table

Эта функция устанавливает таблицу регистра текущего буфера в table.

Макрос: with-case-table table body…

Макрос with-case-table сохраняет текущую таблицу регистра, устанавливает table в качестве текущей таблицы регистра, вычисляет формы body, а затем восстанавливает таблицу регистра. Возвращаемое значение — это значение последней формы в body. Таблица регистра восстанавливается даже в случае аномального выхода через throw или ошибку (см. Нелокальные выходы).

Некоторые языковые среды изменяют преобразования регистра символов ASCII; например, в среде турецкого языка заглавная I ASCII преобразуется в турецкую i без точки (‘ı’). Это может мешать коду, который требует обычного преобразования регистра ASCII, например, реализациям сетевых протоколов на основе ASCII. В этом случае используйте макрос with-case-table с переменной ascii-case-table, которая хранит неизмененную таблицу регистра для набора символов ASCII.

Переменная: ascii-case-table

Таблица регистра для набора символов ASCII. Она не должна изменяться настройками языковой среды.

Следующие три функции являются удобными подпрограммами для пакетов, определяющих не-ASCII наборы символов. Они изменяют указанную таблицу регистра case-table; они также изменяют стандартную синтаксическую таблицу. См. Синтаксические таблицы. Обычно вы используете эти функции для изменения стандартной таблицы регистра.

Функция: set-case-syntax-pair uc lc case-table

Эта функция указывает пару соответствующих букв: одну заглавную и одну строчную.

Функция: set-case-syntax-delims l r case-table

Эта функция делает символы l и r совпадающей парой разделителей, инвариантных к регистру.

Функция: set-case-syntax char syntax case-table

Эта функция делает char инвариантным к регистру с синтаксисом syntax.

Команда: describe-buffer-case-table

Эта команда отображает описание содержимого таблицы регистра текущего буфера.