36.8 Категории

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

Каждый буфер имеет таблицу категорий, которая регистрирует, какие категории определены, а также к каким категориям относятся символы. Каждая таблица категорий определяет свои собственные категории, но обычно они инициализируются путем копирования из стандартной таблицы категорий, чтобы стандартные категории были доступны во всех режимах.

Каждая категория имеет имя, которое является печатным символом ASCII в диапазоне от «‘ ’» до «‘~’». Вы указываете имя категории при ее определении с помощью define-category.

Таблица категорий на самом деле является таблицей символов (см. Таблицы символов). Элемент таблицы категорий по индексу c — это набор категорий — булев вектор, который указывает, к каким категориям принадлежит символ c. В этом наборе категорий, если элемент по индексу cat равен t, это означает, что категория cat является членом набора, и что символ c принадлежит категории cat.

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

Функция: define-category char docstring &optional table

Эта функция определяет новую категорию с именем char и документацией docstring для таблицы категорий table.

Вот пример определения новой категории для символов, имеющих сильную право-левую направленность (см. Право-левая направленность) и ее использования в специальной таблице категорий. Чтобы получить информацию о направленности символов, пример кода использует свойство Unicode «bidi-class» (см. bidi-class).

(defvar special-category-table-for-bidi
  ;;     Создаем пустую таблицу категорий.
  (let ((category-table (make-category-table))
        ;; Создаем таблицу символов, которая дает свойство Unicode 'bidi-class'
        ;; для каждого символа.
        (uniprop-table
         (unicode-property-table-internal 'bidi-class)))
    (define-category ?R "Символы bidi-class R, AL или RLO"
                     category-table)
    ;; Изменяем запись категории каждого символа, чье
    ;; свойство Unicode 'bidi-class' равно R, AL или RLO --
    ;; у них есть право-левая направленность.
    (map-char-table
     (lambda (key val)
       (if (memq val '(R AL RLO))
           (modify-category-entry key ?R category-table)))
     uniprop-table)
    category-table))
Функция: category-docstring category &optional table

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

(category-docstring ?a)
     ⇒ "ASCII"
(category-docstring ?l)
     ⇒ "Latin"
Функция: get-unused-category &optional table

Эта функция возвращает имя категории (символ), которое в настоящее время не определено в table. Если все возможные категории используются в table, она возвращает nil.

Функция: category-table

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

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

Эта функция возвращает t, если object является таблицей категорий, иначе nil.

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

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

Функция: copy-category-table &optional table

Эта функция создает копию table и возвращает ее. Если table не предоставлена (или равна nil), она возвращает копию стандартной таблицы категорий. В противном случае, сигнализируется об ошибке, если table не является таблицей категорий.

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

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

Функция: make-category-table

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

Функция: make-category-set categories

Эта функция возвращает новый набор категорий — булев вектор, — чье начальное содержимое — это категории, перечисленные в строке categories. Элементы categories должны быть именами категорий; новый набор категорий имеет t для каждой из этих категорий и nil для всех других категорий.

(make-category-set "al")
     ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
Функция: char-category-set char

Эта функция возвращает набор категорий для символа char в таблице категорий текущего буфера. Это булев вектор, который регистрирует, к каким категориям принадлежит символ char. Функция char-category-set не выделяет память, поскольку возвращает тот же булев вектор, который существует в таблице категорий.

(char-category-set ?a)
     ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
Функция: category-set-mnemonics category-set

Эта функция преобразует набор категорий category-set в строку, содержащую символы, обозначающие категории, которые являются членами этого набора.

(category-set-mnemonics (char-category-set ?a))
     ⇒ "al"
Функция: modify-category-entry char category &optional table reset

Эта функция изменяет набор категорий char в таблице категорий table (которая по умолчанию является таблицей категорий текущего буфера). char может быть символом или ячейкой конс вида (min . max); в последнем случае функция изменяет наборы категорий всех символов в диапазоне от min до max, включая их.

Обычно она изменяет набор категорий, добавляя category к нему. Но если reset не равен nil, то она удаляет category вместо этого.

Команда: describe-categories &optional buffer-or-name

Эта функция описывает спецификации категорий в текущей таблице категорий. Она вставляет описания в буфер, а затем отображает этот буфер. Если buffer-or-name не равен nil, она описывает таблицу категорий этого буфера вместо этого.