使用font-lock进行终结时,是否可以一次提取多个组?


0

我正试着把头包起来 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为所有特殊子字符串着色,但我想要做的是以不同方式为某些部分着色(数字参数将以不同方式着色,自定义函数调用将以不同方式着色,at和冒号 - 也许不同的是,角色数据 - 也许也不同。

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


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

Answers:


1

快速部分响应而不看你的代码(抱歉) - 所以它可能会错过这条船。

  1. 如果您要问的部分是如何留下一些突出显示的内容 f-l-k 进入即使它也匹配以后 f-l-k 进入,答案是使用 keep。 (另见什么 t 是的,这恰恰相反。)

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

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


谢谢你的回答,我也找到了一个部分答案:使用 ("\\(group one\\)\\(group two\\)" (1 face-one) (2 face-two)) 似乎做了我上面提到的,但它没有解决原始问题,因为提取重复组(如果匹配分隔列表)变得非常繁琐长固定长度列表,并且不可能使用任意长度的列表。所以,是的,我将研究基于搜索的fontification)。
wvxvw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.