Поиск-ориентированное выделение шрифтом
Переменная, которая непосредственно управляет поисково-ориентированным выделением шрифтом, — 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-faceshould be a variable whose value is a face. ("foo\\|bar" 0 foo-bar-face t) ;; Highlight the first subexpression within each occurrence ;; that the functionfubar-matchfinds, ;; using the face which is the value offubar-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 ofitem-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