Emacs 可选部分的语法高亮

4
我正在尝试从fundamental-mode写一个派生模式。假设我有这个正则表达式:A ((foo)bar)? B,我该如何告诉emacs使用以下面字体?
  • font-lock-keyword-faceA
  • font-lock-warning-facefoo 上(而不是bar
  • font-lock-constant-faceB
我已经尝试使用以下代码:
(defvar myregexp
  "\\(A\\) \\(?:\\(foo\\)bar \\)?\\(B\\)")

(setq mylang-font-lock-keywords `(
  (, myregex 1 font-lock-keyword-face)
  (, myregex 2 font-lock-warning-face)
  (, myregex 3 font-lock-constant-face)
))

但是它不能处理字符串A B(emacs报告缺少捕获)。
2个回答

4
使用启用laxmatch的子表达式高亮显示器,使font-lock-mode忽略匹配中缺少的组:
(setq mylang-font-lock-keywords
      `((,myregexp (1 font-lock-keyword-face)
              (2 font-lock-warning-face nil t)
              (3 font-lock-constant-face))))

每个子表达式高亮器的第四个元素是 laxmatch 参数。如果 t,则 font-lock-mode 忽略此高亮器,如果第一个元素中对应的组在 myregexp 的匹配结果中未找到。

有关更多信息,请参见 Emacs Lisp 手册中的 基于搜索的着色


这只需要用于第二个匹配,但在任何地方使用都可以(实际上,我认为默认情况下 font-lock 不松散是一个错误)。此外,您明智地将规则更改为仅使用 myregex 一次,这将使代码加速约 3 倍。但您需要再将关键字包装在一对括号中。 - Stefan
@Stefan 谢谢您的纠正。我已经相应地更新了代码。 - user355252

0

根据您的正则表达式,AB 之间需要两个空格。要么将第二个空格放在可选的 foobar 部分内,要么在其后使用 *?


打字错误已经修复了。仍然存在缺失的捕获错误(Error during redisplay: (error "No match 3 in highlight (1 font-lock-constant-face)"))。 - Maël Nison
你引用的错误信息(“No match 3 in highlight (1 font-lock-constant-face)”)并没有太多意义,也与你的代码不匹配(你的代码中将3与font-lock-constant-face相关联,而不是1)。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接