以下更像是一条评论,因为
- 它只能解决一小部分问题(
rainbow-delimiters-mode
)
- 它未经彻底测试(仅使用一个乳胶文件)
- 我不完全了解为什么它起作用(
font-lock-mode
实际上是相当复杂的机器)
首先,以下解决方案rainbow-delimiters-mode
:
我们替换文本属性font-lock-face
通过face
在rainbow-delimiters-propertize-delimiter
和rainbow-delimiters-unpropertize-delimiter
。由于defsubst
在包中使用,而不是defun
我们不能使用,defalias
而是必须自己修改功能(据我所知-如果我在这方面有误,请发表评论)。
修改后的功能为:
(defsubst rainbow-delimiters-propertize-delimiter (loc depth)
"Highlight a single delimiter at LOC according to DEPTH.
LOC is the location of the character to add text properties to.
DEPTH is the nested depth at LOC, which determines the face to use.
Sets text properties:
`font-lock-face' to the appropriate delimiter face.
`rear-nonsticky' to prevent color from bleeding into subsequent characters typed by the user."
(with-silent-modifications
(let ((delim-face (if (<= depth 0)
'rainbow-delimiters-unmatched-face
(rainbow-delimiters-depth-face depth))))
;; (when (eq depth -1) (message "Unmatched delimiter at char %s." loc))
(add-text-properties loc (1+ loc)
;; 2015-05-24: Changed font-lock-face to face to enable rainbow after syntax fontification in latex-mode
;; (see http://emacs.stackexchange.com/questions/4260/how-to-get-rainbow-delimiters-rainbow-blocks-to-highlight-in-line-math-in-latex)
`(face ,delim-face
rear-nonsticky t)))))
(defsubst rainbow-delimiters-unpropertize-delimiter (loc)
"Remove text properties set by rainbow-delimiters mode from char at LOC."
(with-silent-modifications
(remove-text-properties loc (1+ loc)
;; 2015-05-24: See corresponding line in `rainbow-delimiters-propertize-delimiter'.
'(face nil
rear-nonsticky nil))))
现在进行推理:
$分隔符之间的嵌入式公式由font-lock-mode字体化(正如Kirill指出的那样)。这种字体的注册看起来很正常(请参见variable font-lock-syntactic-face-function
和function font-latex-syntactic-face-function
)。但是describe-char
在一个嵌入式公式的字符处显示,语法字体化使用face
-property而不是font-lock-face
-property。
以下是假设,因为我还没有完全理解非常复杂的字体锁定机制。
似乎face
比强大font-lock-face
。Rainbow分隔符的使用font-lock-face
主要由face
句法字体构成。不过,我们有一个优势,即语法字体化首先出现在基于搜索(关键字)的字体化之前,后者依次使用jit-lock(请参阅参考资料页font-lock-mode
)。
得出的结论是,如果使用face
in rainbow-delimiters
代替,则可以解决问题font-lock-face
。在这里,我不知道全部后果。但是,由于rainbow-delimiters
也jit-lock
直接使用(而不是通过font-lock-mode
),所以我们还是站在摇摇欲坠的地板上。
请注意,我已经与接触过rainbow-delimiters
(请参阅/programming/19800243/highlight-first-mismatching-paren/20022030#20022030),但尚未与接触rainbow-blocks
。因为我的时间有限,所以我选择专心rainbow-delimiters
。也许,您可以rainbow-blocks
通过类似的方式解决-problem问题。