使用字体锁进行字体处理时是否可以一次提取多个组?

使用字体锁进行字体处理时是否可以一次提取多个组?

我正在尝试理解font-lock-keywords格式,特别是MATCH-ANCHORED变体,但我不知道如何重复使用由一个正则表达式生成的匹配项。下面是我的设置,用于说明:

(defvar fmt-font-lock-keywords
  ;; no-args
  `(("~\\(@:?\\|:@?\\)?[]>()}aswvcp;_]"
     (0 font-lock-keyword-face))
    ;; numeric-arg
    ("~\\([0-9]*\\|#,?\\)\\(@:?\\|:@?\\)?[i*%&|~{[]"
     (0 font-lock-keyword-face))
    ;; decimal
    ("~\\([0-9]*\\|#\\(,[0-9]*\\|#\\)\\{0,3\\}\\)?\\(@:?\\|:@?\\)?[rdbox]"
     (0 font-lock-keyword-face))
    ;; floating-point f
    (,(concat
       "~\\(\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{3\\}\\(,'\\w\\)\\{1,2\\}\\)\\|"
       "\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,3\\}\\)\\)"
       "?\\(@:?\\|:@?\\)?f")
     (0 font-lock-keyword-face))
    ;; floating-point e, g
    (,(concat
       "~\\(\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{3\\}\\(,'\\w\\)\\{1,3\\}\\)\\|"
       "\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,3\\}\\)\\)"
       "?\\(@:?\\|:@?\\)?[eg]")
     (0 font-lock-keyword-face))
    ;; currency
    (,(concat
       "~\\(\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{2\\}\\(,'\\w\\)\\)\\|"
       "\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,2\\}\\)\\)"
       "?\\(@:?\\|:@?\\)?[$]")
     (0 font-lock-keyword-face))
    ;; tabulation
    ("~\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)?\\)?\\(@:?\\|:@?\\)?t"
     (0 font-lock-keyword-face))
    ;; escape
    ("~\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,2\\}\\)?\\(@:?\\|:@?\\)?^"
     (0 font-lock-keyword-face))
    ;; logical block
    ("~\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,3\\}\\)?\\(@:?\\|:@?\\)?<"
     (0 font-lock-keyword-face))
    ;; custom function
    (,(concat
       "~\\(\\([0-9]+\\|'\\w\\|#\\)\\(,\\([0-9]+\\|'\\w\\|#\\)+\\)*\\)?"
       "\\(@:?\\|:@?\\)?\\/[^\\s\\n,#@]+\\/")
     (0 font-lock-keyword-face))))

并且,初始化此模式时:

(define-derived-mode fmt-mode fundamental-mode
  . . .
  (set (make-local-variable 'font-lock-defaults)
      '(fmt-font-lock-keywords)) . . .)

抱歉,我知道它看起来像楔形文字,但它的作用实际上非常简单......它正在解析 Common Lisp 格式的微语言。

它现在的作用是:它使用关键字 face 为所有特殊子字符串着色,但我想要做的是为某些部分着色不同(数值参数会着色不同,自定义函数调用会着色不同,冒号 - 可能不同,字符数据 - 也可能不同)。

从技术上讲,我可以复制这些正则表达式来提取不同的组,但这非常不雅观,此外,在可以传递可变数量的参数的情况下,写入将接近组合爆炸......


我确实意识到,不使用正则表达式时,解析问题可以更容易解决,但我不知道如何将其与字体锁定模式相结合。但如果你碰巧知道如何在不使用正则表达式的情况下做到这一点,同时仍然使用字体锁定机制进行着色,那也是一个很好的答案!

答案1

不看您的代码就做出快速部分回应(抱歉) - 所以很可能会错过机会。

  1. 如果你要问的部分内容是如何保留某个条目突出显示的内容,f-l-k即使它也与后面的f-l-k条目匹配,那么答案是使用keep. (另见t事实恰恰相反。)

  2. 如果您要问的问题是如何在不使用正则表达式的情况下或不使用仅使用正则表达式的情况下锁定字体,那么答案就是使用函数。

如果还没有,请参阅 Elisp 手册,节点Search-based Fontification——搜索keepFUNCTION

相关内容