24.7.3 自定义基于搜索的字体高亮

你可以使用 font-lock-add-keywords 为主模式添加额外的 基于搜索的高亮规则,使用 font-lock-remove-keywords 移除规则。你也可以自定义 font-lock-ignore 选项, 有选择地禁用匹配特定条件的关键字高亮规则。

Function: font-lock-add-keywords mode keywords &optional how

该函数为当前缓冲区或主模式 mode 添加高亮关键字 keywords。 参数 keywords 应为格式与变量 font-lock-keywords 相同的列表。

mode 是代表主模式命令名的符号(如 c-mode), 则效果是在 mode 中启用字体锁定模式时, 会将 keywords 添加到 font-lock-keywords。 传入非 nilmode 仅适合在 ~/.emacs 文件中使用。

modenil,则该函数将 keywords 添加到当前缓冲区的 font-lock-keywords。 这种调用方式通常用于模式钩子函数。

默认情况下,keywords 会添加到 font-lock-keywords 的开头。 若可选参数 howset, 则用其替换 font-lock-keywords 的值。 若 how 为其他非 nil 值, 则添加到 font-lock-keywords 的末尾。

部分模式为额外高亮模式提供专用支持。 例如参见变量 c-font-lock-extra-typesc++-font-lock-extra-typesjava-font-lock-extra-types

警告: 主模式命令在任何情况下都不应直接或间接调用 font-lock-add-keywords,除非通过其模式钩子。 (否则会导致部分次要模式行为异常。) 主模式应通过设置 font-lock-keywords 配置基于搜索的高亮规则。

Function: font-lock-remove-keywords mode keywords

该函数从当前缓冲区或主模式 modefont-lock-keywords 中移除 keywords。 与 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)))))
User Option: font-lock-ignore

该选项定义有选择地禁用特定字体锁定关键字导致的高亮的条件。 若为非 nil,其值为如下形式的元素列表:

(symbol condition ...)

其中 symbol 是一个符号,通常为主模式或次要模式。 当 symbol 被绑定且值为非 nil 时, 该符号对应列表中的后续 condition 生效。 对模式符号而言,这表示当前主模式派生自该模式, 或该次要模式在缓冲区中已启用。 当某个 condition 生效时, 所有由匹配该条件的 font-lock-keywords 元素触发的高亮都会被禁用。

每个 condition 可以是以下之一:

a symbol

该条件匹配所有引用该符号的字体锁定关键字元素。 通常为外观,但也可以是 font-lock-keywords 列表元素引用的任意符号。符号中可包含通配符: * 匹配符号名中的任意字符串, ? 匹配单个字符, 而 [char-set](其中 char-set 为一个或多个字符组成的字符串) 匹配集合中的单个字符。

a string

该条件匹配所有 matcher 为能匹配该字符串的正则表达式的 字体锁定关键字元素。换句话说, 该条件匹配用于高亮该字符串的字体锁定规则。 因此该字符串可以是你希望禁用高亮的特定程序关键字。

(pred function)

This condition matches any element of Font Lock keywords for which function, when called with the element as the argument, returns non-nil.

(pred function)

该条件匹配所有以元素为参数调用 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. 在所有编程模式中,禁用所有应用标准字体锁定外观的关键字高亮 (字符串与注释由语法字体锁定处理,不在此列)。
  2. 但保留所有添加 help-echo 文本属性的关键字。
  3. 在 Emacs Lisp 模式中,额外保留自动加载标记的高亮, 这类高亮本会被第一条规则排除。
  4. 当启用 whitespace-mode(次要模式)时, 同时不高亮缓冲区开头的空行。
  5. 最后,在 Makefile 模式中不应用任何条件。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike