Поиск-основанное форматирование шрифтов
Переменная, которая напрямую управляет поисковым форматированием шрифтов, это 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 не обязана сбрасывать текущую позицию каким-либо определенным образом.
(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 — это лисп-переменная (символ), значение которой — имя стиля.
;; 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, это означает, что не должно быть ошибки, если нет подстроки с номером subexp в matcher. Очевидно, форматирование подстроки с номером 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.
После того, как Font Lock оценил pre-form, он не ищет anchored-matcher за пределами конца строки. Однако, если pre-form возвращает позицию буфера, которая больше позиции текущей позиции после оценки 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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Search_002dbased-Fontification.html