36.3 Функции таблицы синтаксиса

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

Функция: make-syntax-table &optional table

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

В новой таблице синтаксиса всем символам изначально присваивается синтаксический класс «inherit» (‘@’), то есть их синтаксис наследуется от родительской таблицы (см. Таблица синтаксических классов).

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

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

Команда: modify-syntax-entry char syntax-descriptor &optional table

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

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

Аргумент syntax-descriptor — это дескриптор синтаксиса, то есть строка, первый символ которой является обозначением синтаксического класса, а второй и последующие символы необязательно указывают соответствующий символ и флаги синтаксиса. См. Дескрипторы синтаксиса. Сигнализируется об ошибке, если syntax-descriptor не является действительным дескриптором синтаксиса.

Эта функция всегда возвращает nil. Старая информация о синтаксисе в таблице для этого символа отбрасывается.

Примеры:

;; Поместить пробельный символ в класс whitespace.
(modify-syntax-entry ?\s " ")
     ⇒ nil

;; Сделать '$' символом открывающей скобки,
;;   с '^' как соответствующим закрывающим.
(modify-syntax-entry ?$ "(^")
     ⇒ nil

;; Сделать '^' символом закрывающей скобки,
;;   с '$' как соответствующим открывающим.
(modify-syntax-entry ?^ ")$")
     ⇒ nil

;; Сделать '/' символом пунктуации,
;;   первым символом последовательности начала комментария,
;;   и вторым символом последовательности конца комментария.
;;   Это используется в режиме C.
(modify-syntax-entry ?/ ". 14")
     ⇒ nil
Функция: char-syntax character

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

Следующие примеры применимы к режиму C. (Мы используем string, чтобы было легче увидеть символ, возвращаемый char-syntax.)

;; Символы пробела имеют синтаксический класс whitespace.
(string (char-syntax ?\s))
     ⇒ " "

;; Символы прямого слэша имеют пунктуационный синтаксис.
;; Обратите внимание, что этот вызов char-syntax не раскрывает,
;; что он также является частью последовательностей начала и конца комментария.
(string (char-syntax ?/))
     ⇒ "."

;; Символы открывающей скобки имеют синтаксис открывающей скобки.
;; Обратите внимание, что этот вызов char-syntax не раскрывает,
;; что у него есть соответствующий символ, ‘)’.
(string (char-syntax ?\())
     ⇒ "("
Функция: set-syntax-table table

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

Функция: syntax-table

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

Команда: describe-syntax &optional buffer

Эта команда отображает содержимое таблицы синтаксиса buffer (по умолчанию, текущего буфера) в буфере справки.

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

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

Поскольку каждый буфер имеет свою собственную текущую таблицу синтаксиса, нам следует уточнить это: with-syntax-table временно изменяет текущую таблицу синтаксиса того буфера, который является текущим в момент начала выполнения макроса. Другие буферы не затрагиваются.