我尝试使用font-lock和elisp的regex来突出显示如下内容:
class Foo implements A, B, C, D { }
问题是implements
后逗号分隔列表的长度未知。我已经做了regex,它突出显示列表中的所有单词(使用re-buider,A,B,C和D突出显示):
"implements\\s-+\\(?:\\(\\sw+\\)\\s-*,\\s-*\\)*\\(\\sw+\\)"
但是我不能把它和font-lock结合起来。
显然
'("implements\\s-+\\(?:\\(\\sw+\\)\\s-*,\\s-*\\)*\\(\\sw+\\)"
(1 font-lock-type-face) (2 font-lock-type-face))
不起作用,因为它只突出显示到最后一个实例(C和D),而忽略第一个反向引用后的星号(*
)。
有没有一种方法可以捕获所有匹配单词的列表,或者可能有完全不同的方法来解决这个问题?
发布于 2011-05-30 06:06:22
如果您不希望逗号也被突出显示,那么您的方法将无法工作。当您使用表单的subexp-highlighter时
(subexp facespec)
subexp
引用您的正则表达式的子组,并使用给定的facespec
突出显示。现在,regexp匹配的子组是具有开头和结尾的连续文本范围。实际上,无论何时执行正则表达式搜索,都可以使用函数(match-beginning subexp)
和(match-end subexp)
查询这些值。
但这意味着您不能将数量可变的不含逗号的类名与单个子表达式匹配,因为该子表达式必须是连续跨度的。并且覆盖可变数量类名的连续跨度也必须始终包含逗号,这是没有办法的。
您的方法不是一个好主意的另一个原因是:您的regexp显式使用了空格。如果从高亮显示中排除空格并不重要,但即使在regexp中使用它也不是一个好主意,因为在允许使用空格的任何地方,您都可能遇到注释。
考虑以下代码行:
class Foo implements A, /*B, C,*/ D { }
在这种情况下,您可能希望使用font-lock-comment-face
突出显示span /*B, C,*/
中的字符,并使用font-lock-type-face
突出显示周围的类。如果您仅在所有其他内容都已突出显示之后才突出显示注释,并允许注释覆盖其他字体锁定匹配,则仍可实现此效果。但这将导致相当低效的匹配,因为每个注释都会首先突出显示,就好像它是代码一样,然后在第二次传递中突出显示为注释。
这两个问题的解决方案可能是将关键字("implements")和类的匹配划分为两个不同的匹配规则,也许您可以使用以下内容作为起点:
'(("\\bimplements\\b" . font-lock-keyword-face)
("\\b[A-Z]\\w*\\b" . font-lock-type-face))
发布于 2011-05-26 17:20:09
类似这样的东西在这里似乎是有效的:
'("\\(implements\\)\\s-+\\(\\(\\sw+\\s-*,\\s-*\\)*\\sw+\\)"
(1 font-lock-warning-face)
(2 font-lock-keyword-face))
(很明显,你可能想要不同的面孔…)
https://stackoverflow.com/questions/6120450
复制相似问题