24.7.3 Настройка подсветки на основе поиска

Вы можете использовать font-lock-add-keywords для добавления дополнительных правил подсветки на основе поиска в основной режим, и font-lock-remove-keywords для удаления правил. Вы также можете настроить опцию font-lock-ignore, чтобы выборочно отключить правила подсветки для ключевых слов, соответствующих определенным критериям.

Функция: font-lock-add-keywords mode keywords &optional how

Эта функция добавляет выделение keywords для текущего буфера или для основного режима mode. Аргумент keywords должен быть списком в том же формате, что и переменная font-lock-keywords.

Если mode — это символ, представляющий имя команды основного режима, например c-mode, то эффект заключается в том, что включение режима Font Lock в mode добавит keywords в font-lock-keywords. Вызов с не-nil значением mode корректен только в вашем файле ~/.emacs.

Если mode равен nil, эта функция добавляет keywords в font-lock-keywords в текущем буфере. Такой способ вызова font-lock-add-keywords обычно используется в функциях хуков режима.

По умолчанию keywords добавляются в начало font-lock-keywords. Если необязательный аргумент how установлен в set, они используются для замены значения font-lock-keywords. Если how имеет любое другое не-nil значение, они добавляются в конец font-lock-keywords.

Некоторые режимы предоставляют специализированную поддержку, которую вы можете использовать в дополнительных шаблонах подсветки. См. переменные c-font-lock-extra-types, c++-font-lock-extra-types и java-font-lock-extra-types, например.

Предупреждение: Команды основного режима не должны вызывать font-lock-add-keywords ни при каких обстоятельствах, ни прямо, ни косвенно, кроме как через их хуки режима. (Такое действие приведет к некорректному поведению для некоторых второстепенных режимов.) Они должны настраивать свои правила для подсветки на основе поиска, устанавливая font-lock-keywords.

Функция: font-lock-remove-keywords mode keywords

Эта функция удаляет keywords из font-lock-keywords для текущего буфера или для основного режима mode. Как и в font-lock-add-keywords, mode должен быть именем команды основного режима или nil. Все оговорки и требования, применимые к font-lock-add-keywords, также применимы здесь. Аргумент keywords должен в точности соответствовать тому, который использовался в соответствующем font-lock-add-keywords.

Например, следующий код добавляет два шаблона подсветки для режима C: один для подсветки слова «FIXME», даже в комментариях, и другой для подсветки слов «and», «or» и «not» как ключевых слов.

(font-lock-add-keywords 'c-mode
 '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
   ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))

Этот пример влияет только на режим C. Чтобы добавить те же шаблоны в режим C и все режимы, производные от него, сделайте это вместо этого:

(add-hook 'c-mode-hook
 (lambda ()
  (font-lock-add-keywords nil
   '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
     ("\\<\\(and\\|or\\|not\\)\\>" .
      font-lock-keyword-face)))))
Пользовательская опция: font-lock-ignore

Эта опция определяет условия для выборочного отключения подсветки из-за определенных ключевых слов Font Lock. Если она не nil, ее значение представляет собой список элементов следующей формы:

(symbol condition …)

Здесь symbol — это символ, обычно основной или второстепенный режим. Последующие conditionы элемента списка symbol будут действовать, если symbol связан, и его значение не равно nil. Для символа режима это означает, что текущий основной режим производный от этого режима, или что второстепенный режим включен в буфере. Когда condition действует, любая подсветка, вызванная элементами font-lock-keywords, соответствующими condition, будет отключена.

Каждая condition может быть одной из следующих:

символ

Это условие соответствует любому элементу ключевых слов Font Lock, который ссылается на этот символ. Обычно это шрифт, но это может быть любой символ, на который ссылается элемент списка font-lock-keywords. Символ может содержать подстановочные знаки: * соответствует любой строке в имени символа, ? соответствует одному символу, а [char-set], где char-set — это строка из одного или более символов, соответствует одному символу из набора.

строка

Это условие соответствует любому элементу ключевых слов Font Lock, чей matcher является регулярным выражением, соответствующим строке. Другими словами, это условие соответствует правилу Font Lock, которое выделяет строку. Таким образом, эта строка может быть конкретным ключевым словом программы, подсветку которого вы хотите отключить.

(pred function)

Это условие соответствует любому элементу ключевых слов Font Lock, для которого function, вызванная с элементом в качестве аргумента, возвращает не nil.

(not condition)

Это соответствует, если condition не выполняется.

(and condition …)

Это соответствует, если каждое из condition выполняется.

(or condition …)

Это соответствует, если выполняется хотя бы одно из condition.

(except condition)

Это условие может использоваться только на верхнем уровне или внутри клаузы or. Оно отменяет эффект ранее соответствующего условия на том же уровне.

Например, рассмотрите следующую настройку:

(setq font-lock-ignore
      '((prog-mode font-lock-*-face
                   (except help-echo))
        (emacs-lisp-mode (except ";;;###autoload)")
        (whitespace-mode whitespace-empty-at-bob-regexp)
        (makefile-mode (except *))))

Построчно это делает следующее:

  1. Во всех режимах программирования отключает подсветку, вызванную всеми ключевыми словами font-lock, которые применяют один из стандартных шрифтов font-lock (исключая строки и комментарии, которые покрываются синтаксической Font Lock).
  2. Однако сохраняет любые ключевые слова, которые добавляют свойство текста help-echo.
  3. В режиме Emacs Lisp также сохраняет подсветку файлов автозагрузки, которая была бы исключена первым условием.
  4. Когда включен whitespace-mode (второстепенный режим), также не выделяет пустую строку в начале буфера.
  5. Наконец, в режиме Makefile не применяются никакие условия.