我正试着把头包起来 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,同时仍然使用字体锁定机制进行着色,那么这也是一个很好的答案!
("\\(group one\\)\\(group two\\)" (1 face-one) (2 face-two))
似乎做了我上面提到的,但它没有解决原始问题,因为提取重复组(如果匹配分隔列表)变得非常繁琐长固定长度列表,并且不可能使用任意长度的列表。所以,是的,我将研究基于搜索的fontification)。