Категории предоставляют альтернативный способ классификации символов с точки зрения синтаксиса. Вы можете определить несколько категорий по мере необходимости, а затем независимо назначить каждый символ одной или нескольким категориям. В отличие от классов синтаксиса, категории не являются взаимоисключающими; нормально, если один символ принадлежит к нескольким категориям.
Каждый буфер имеет таблицу категорий, которая регистрирует, какие категории определены, а также к каким категориям относятся символы. Каждая таблица категорий определяет свои собственные категории, но обычно они инициализируются путем копирования из стандартной таблицы категорий, чтобы стандартные категории были доступны во всех режимах.
Каждая категория имеет имя, которое является печатным символом ASCII
в диапазоне от «‘ ’» до «‘~’». Вы указываете имя категории
при ее определении с помощью define-category.
Таблица категорий на самом деле является таблицей символов (см. Таблицы символов).
Элемент таблицы категорий по индексу c — это набор категорий — булев вектор,
который указывает, к каким категориям принадлежит символ c. В этом наборе категорий, если элемент
по индексу cat равен t, это означает, что категория cat
является членом набора, и что символ c принадлежит категории cat.
Для следующих трех функций необязательный аргумент 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 в таблице категорий table.
(category-docstring ?a)
⇒ "ASCII"
(category-docstring ?l)
⇒ "Latin"
Эта функция возвращает имя категории (символ), которое в настоящее время
не определено в table. Если все возможные категории используются
в table, она возвращает nil.
Эта функция возвращает таблицу категорий текущего буфера.
Эта функция возвращает t, если object является таблицей категорий,
иначе nil.
Эта функция возвращает стандартную таблицу категорий.
Эта функция создает копию table и возвращает ее. Если
table не предоставлена (или равна nil), она возвращает копию
стандартной таблицы категорий. В противном случае, сигнализируется об ошибке, если table
не является таблицей категорий.
Эта функция устанавливает table в качестве таблицы категорий для текущего буфера. Она возвращает table.
Эта функция создает и возвращает пустую таблицу категорий. В пустой таблице категорий не выделено ни одной категории, и ни один символ не принадлежит ни к какой категории.
Эта функция возвращает новый набор категорий — булев вектор, — чье начальное
содержимое — это категории, перечисленные в строке 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 в
таблице категорий текущего буфера. Это булев вектор, который регистрирует, к каким
категориям принадлежит символ 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 в строку, содержащую символы, обозначающие категории, которые являются членами этого набора.
(category-set-mnemonics (char-category-set ?a))
⇒ "al"
Эта функция изменяет набор категорий char в таблице категорий
table (которая по умолчанию является таблицей категорий текущего буфера).
char может быть символом или ячейкой конс вида
(min . max); в последнем случае функция
изменяет наборы категорий всех символов в диапазоне от
min до max, включая их.
Обычно она изменяет набор категорий, добавляя category к нему.
Но если reset не равен nil, то она удаляет category
вместо этого.
Эта функция описывает спецификации категорий в текущей
таблице категорий. Она вставляет описания в буфер, а затем
отображает этот буфер. Если buffer-or-name не равен nil,
она описывает таблицу категорий этого буфера вместо этого.