我正在尝试改进 emacs c++-mode 语法突出显示,需要找到一个正则表达式来匹配代码中的成员变量。
我想与正则表达式匹配的是屏幕截图中的红色关键字而不是蓝色关键字。
要查找函数调用(蓝色的),我使用表达式([a-zA-Z_]+[a-zA-Z0-9_]*)+[(]
我想修改它,以便如果关键字后面有任何括号,它不匹配。
我认为这应该做你想要的。
(font-lock-add-keywords
'c++-mode
'(("\\(\\_<[a-zA-Z_][a-zA-Z0-9_]*\\_>\\)[(]" 1 font-lock-function-name-face)
("\\.\\(\\_<[a-zA-Z_][a-zA-Z0-9_]*\\_>\\)" 1 font-lock-variable-name-face)))
我稍微修改了您的第一个正则表达式以尝试解决您的性能问题(请参阅下面的解释)。第二个正则表达式只是将尾随括号交换为前导句点;我们依靠两个正则表达式的顺序来处理匹配两者的方法调用。
正如其他人所提到的,您的性能问题可能是由于正则表达式可以以太多方式匹配。使用符号边界标记进行锚定,\_<
应该会\_>
有所帮助。+
我也对非不相交字符集上的相邻和组感到困扰*
,但我不知道这是否真的是一个问题。
由于您似乎不想在字符串和注释中突出显示,因此您应该append
停止。如果您想要字符串和注释突出显示,您将使用prepend
, whileappend
仅当您使用的面设置了字符串或注释面没有的属性并且您想将两者结合起来时才有用。要查看我在说什么,请尝试替换font-lock-function-name-face
为'hi-yellow
. (引用在这里是相关的,因为高亮面没有像字体锁定面那样的可变别名。)