Emacs语法高亮显示可选部分

时间:2012-11-04 04:23:31

标签: emacs elisp font-lock emacs-faces

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

2 个答案:

答案 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)

指定正则表达式的方式,AB之间需要两个空格。将可选的foobar部件内的第二个空间拉出,或在其后面使用*?