我正在尝试从基本模式编写派生模式。假设我有这个正则表达式:A ((foo)bar)? B
,我如何告诉emacs使用以下面孔?
font-lock-keyword-face
A
font-lock-warning-face
foo
(但不是bar
)font-lock-constant-face
B
我尝试使用以下代码:
(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报告缺少捕获)。
答案 0 :(得分:3)
使用启用了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))))
每个subexp突出显示器的第四个元素是laxmatch
参数。如果在t
的匹配结果中找不到第一个元素中的相应组,myregexp
font-lock-mode将忽略此突出显示。
有关详细信息,请参阅Emacs Lisp手册中的Search-based Fontification。
答案 1 :(得分:0)
指定正则表达式的方式,A
和B
之间需要两个空格。将可选的foobar部件内的第二个空间拉出,或在其后面使用*
或?
。