4

我正在尝试从基本模式编写派生模式。假设我有这个正则表达式: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 报告丢失的捕获)。

4

2 回答 2

4

使用启用了 laxmatch 的 subexp 荧光笔让 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参数。如果tfont-lock-mode 在myregexp.

有关更多信息,请参阅Emacs Lisp 手册中的基于搜索的字体。

于 2012-11-05T09:54:25.553 回答
0

指定正则表达式的方式,在A和之间需要两个空格B。要么在可选的 foobar 部分内拉第二个空格,要么在它之后使用*or ?

于 2012-11-04T12:07:12.597 回答