代码高亮问题,怎么去掉最后引号的高亮


#1

在wiki上抄了一段代码,https://www.emacswiki.org/emacs/AddKeywords 对c的printf高亮里面的格式化标示,例如%d %f之类的,现在‘%?’的标识符在字符串的最后的时候,最后的引号也给高亮了,而且是font-lock-warning-face,不是我设置的face,请问下这啥原因?搞了半天也没解决,用re-builder测试高亮的就是%?,没有最后的引号。下面有截图和设置

(add-hook 'c-mode-common-hook
	  (lambda ()
	    (font-lock-add-keywords nil
				    '(("[^%]\\(%\\([[:digit:]]+\\$\\)?[-+' #0*]*\\([[:digit:]]*\\|\\*\\|\\*[[:digit:]]+\\$\\)\\(\\.\\([[:digit:]]*\\|\\*\\|\\*[[:digit:]]+\\$\\)\\)?\\([hlLjzt]\\|ll\\|hh\\)?\\([aAbdiuoxXDOUfFeEgGcCsSpn]\\|\\[\\^?.[^]]*\\]\\)\\)"
				       1 font-lock-builtin-face t)
				      ("\\(%%\\)" 1 font-lock-type-face t)
                                      ) )))

#2

试了下把 font-lock-add-keywords 的第三个参数 HOW 设置为 t 就 OK 了。

image

估计这辈子也看不明白那个 200+ 字符长度的正则表达式了。


#3

多谢,添加了t后果然好了,请教下这个是啥原因


#4

C-h f 显示:

If HOW is any other non-nil value, they are added at the end of the current highlighting list.

大意是把你的高亮规则放到最后执行,至于其它我不比你了解地更多。


#5

:+1:

源代码很清楚了,就是把你的正则放在尾部:

(setq font-lock-keywords (if how
					    (append old keywords)
					  (append keywords old)))

这个 how 感觉就像是 css 里的 !important。当自定义样式不灵光又没看出问题在哪,就祭出 !important,用多了可能又出新问题了。

依赖顺序是危险的,保不齐以后再加点什么又受到影响,也许你的正则还有改进的空间。