Spec-Zone.ru › Elisp

Поиск-ориентированное выделение шрифтом

Переменная, которая непосредственно управляет поисково-ориентированным выделением шрифтом, — font-lock-keywords; обычно она задаётся через элемент keywords в font-lock-defaults.

Переменная: font-lock-keywords

Значение этой переменной — список ключевых слов, которые нужно выделить. Программы на Lisp не должны устанавливать эту переменную напрямую. Обычно значение автоматически задаётся режимом Font Lock с использованием элемента keywords в font-lock-defaults. Значение также можно изменить с помощью функций font-lock-add-keywords и font-lock-remove-keywords (см. Настройка поисково-ориентированного выделения шрифтом).

Каждый элемент font-lock-keywords задаёт способ поиска определённых фрагментов текста и их выделения. Режим Font Lock обрабатывает элементы font-lock-keywords по одному и для каждого элемента находит и обрабатывает все совпадения. Как правило, после того как часть текста уже выделена шрифтом, последующее совпадение в том же тексте не может изменить это выделение; однако вы можете задать другое поведение с помощью элемента override в subexp-highlighter.

Каждый элемент font-lock-keywords должен иметь одну из следующих форм:

regexp

Выделить все совпадения regexp с помощью font-lock-keyword-face. Например:

;; Highlight occurrences of the word ‘foo’
;; using font-lock-keyword-face.
"\\<foo\\>"

Тщательно составляйте эти регулярные выражения: неудачно написанный шаблон может значительно замедлить работу! Функция regexp-opt (см. Функции регулярных выражений) полезна для вычисления оптимальных регулярных выражений, соответствующих нескольким ключевым словам.

function

Найти текст, вызвав function, и выделить найденные совпадения с помощью font-lock-keyword-face.

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

При выделении шрифтом function будет многократно вызываться с тем же пределом и с текущей позицией, оставленной предыдущим вызовом, пока function не завершится неудачей. При неудаче function не обязана устанавливать текущую позицию каким-либо определённым образом.

function также может самостоятельно выделять область между текущей позицией и полученным аргументом-пределом. В этом случае она должна вернуть nil; в противном случае font-lock выделит совпадение, описанное данными о совпадении, и может снова вызвать функцию с тем же пределом.

(matcher . subexp)

В элементе этого вида matcher — это регулярное выражение или функция, описанные выше. CDR, subexp, указывает, какое подвыражение matcher следует выделить (вместо всего текста, которому соответствует matcher).

;; Highlight the ‘bar’ in each occurrence of ‘fubar’,
;; using font-lock-keyword-face.
("fu\\(bar\\)" . 1)
(matcher . facespec)

В элементе этого вида facespec — это выражение, значение которого задаёт начертание для выделения. В простейшем случае facespec — это переменная Lisp (символ), значение которой является именем начертания.

;; Highlight occurrences of ‘fubar’,
;; using the face which is the value of fubar-face.
("fubar" . fubar-face)

Однако facespec также может вычисляться в список следующего вида:

(subexp
 (face face prop1 val1 prop2 val2...))

чтобы задать начертание face и различные дополнительные свойства текста, которые нужно установить для совпавшего текста. Если вы поступаете таким образом, не забудьте добавить имена других задаваемых здесь свойств текста к значению font-lock-extra-managed-props, чтобы эти свойства также очищались, когда они больше не нужны. В качестве альтернативы можно присвоить переменной font-lock-unfontify-region-function функцию, которая очищает эти свойства. См. Другие переменные Font Lock.

(matcher . subexp-highlighter)

В элементе этого вида subexp-highlighter — это список, задающий способ выделения совпадений, найденных с помощью matcher. Он имеет следующую форму:

(subexp facespec [override [laxmatch]])

CAR, subexp, — это целое число, указывающее, какое подвыражение совпадения нужно выделить шрифтом (0 означает весь совпавший текст). Второй подэлемент, facespec, — это выражение, значение которого задаёт начертание, как описано выше.

Последние два значения в subexp-highlighter, override и laxmatch, — необязательные флаги. Если override имеет значение t, этот элемент может переопределить выделение шрифтом, выполненное предыдущими элементами font-lock-keywords. Если оно имеет значение keep, каждый символ выделяется шрифтом, только если он ещё не был выделен каким-либо другим элементом. Если оно имеет значение prepend, начертание, заданное facespec, добавляется в начало свойства font-lock-face. Если оно имеет значение append, начертание добавляется в конец свойства font-lock-face.

Если laxmatch не равно nil, это означает, что отсутствие в matcher подвыражения с номером subexp не должно вызывать ошибку. Очевидно, подвыражение с номером subexp выделено не будет. Однако выделение других подвыражений (и других регулярных выражений) продолжится. Если laxmatch имеет значение nil, а указанное подвыражение отсутствует, возникает ошибка, прерывающая поисково-ориентированное выделение шрифтом.

Вот несколько примеров элементов этого вида и описание их действия:

;; Highlight occurrences of either ‘foo’ or ‘bar’, using
;; foo-bar-face, even if they have already been highlighted.
;; foo-bar-face should be a variable whose value is a face.
("foo\\|bar" 0 foo-bar-face t)

;; Highlight the first subexpression within each occurrence
;; that the function fubar-match finds,
;; using the face which is the value of fubar-face.
(fubar-match 1 fubar-face)
(matcher . anchored-highlighter)

В элементе этого вида anchored-highlighter задаёт способ выделения текста, следующего за совпадением, найденным с помощью matcher. Таким образом, совпадение, найденное с помощью matcher, служит точкой привязки для дальнейшего поиска, заданного anchored-highlighter. anchored-highlighter — это список следующего вида:

(anchored-matcher pre-form post-form subexp-highlighters...)

Здесь anchored-matcher, как и matcher, — это регулярное выражение или функция. После обнаружения совпадения matcher текущая позиция находится в конце совпадения. Затем Font Lock вычисляет форму pre-form. После этого он ищет совпадения anchored-matcher и выделяет их с помощью subexp-highlighters. Элемент subexp-highlighter описан выше. Наконец, Font Lock вычисляет post-form.

Формы pre-form и post-form можно использовать для инициализации перед использованием anchored-matcher и очистки после него. Обычно pre-form используется для перемещения текущей позиции в положение относительно совпадения matcher перед началом работы с anchored-matcher. post-form можно использовать, чтобы вернуться назад перед возобновлением работы с matcher.

После вычисления pre-form Font Lock не ищет anchored-matcher за концом строки. Однако если pre-form возвращает позицию в буфере, которая больше позиции текущей точки после вычисления pre-form, возвращённая позиция используется как предел поиска. Как правило, возвращать позицию за концом строки не следует; иными словами, поиск anchored-matcher не должен охватывать несколько строк.

Например:

;; Highlight occurrences of the word ‘item’ following
;; an occurrence of the word ‘anchor’ (on the same line)
;; in the value of item-face.
("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face))

Здесь pre-form и post-form — nil. Поэтому поиск ‘item’ начинается в конце совпадения ‘anchor’, а поиск следующих вхождений ‘anchor’ возобновляется с того места, где завершился поиск ‘item’.

(matcher highlighters…)

Элемент этого вида задаёт несколько списков highlighter для одного matcher. Список highlighter может быть типа subexp-highlighter или anchored-highlighter, как описано выше.

Например:

;; Highlight occurrences of the word ‘anchor’ in the value
;; of anchor-face, and subsequent occurrences of the word
;; ‘item’ (on the same line) in the value of item-face.
("\\<anchor\\>" (0 anchor-face)
                ("\\<item\\>" nil nil (0 item-face)))
(eval . form)

Здесь form — выражение, вычисляемое при первом использовании этого значения font-lock-keywords в буфере. Его значение должно иметь одну из форм, описанных в этой таблице.

Предупреждение: Не создавайте элементы font-lock-keywords, соответствующие тексту, занимающему несколько строк: это работает ненадёжно. Подробности см. в разделе Многострочные конструкции Font Lock.

Вы можете использовать case-fold в font-lock-defaults, чтобы задать значение font-lock-keywords-case-fold-search, определяющее, должен ли поисково-ориентированный поиск не учитывать регистр.

Переменная: font-lock-keywords-case-fold-search

Значение, отличное от nil, означает, что сопоставление с регулярными выражениями для font-lock-keywords должно не учитывать регистр.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Search_002dbased-Fontification.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API