A seguir, mais parece um comentário, pois
- resolve apenas uma pequena parte do problema (
rainbow-delimiters-mode
)
- não é completamente testado (apenas com um arquivo de látex)
- Eu não entendo completamente por que funciona (
font-lock-mode
é realmente uma máquina bastante complicada)
A princípio, a solução para rainbow-delimiters-mode
:
Substituímos a propriedade text font-lock-face
por face
in rainbow-delimiters-propertize-delimiter
e rainbow-delimiters-unpropertize-delimiter
. Uma vez que defsubst
é usado no pacote em vez de defun
não podemos empregar, defalias
mas devemos modificar as próprias funções (tanto quanto eu entendo - por favor, comente se eu estiver errado a esse respeito).
As funções modificadas são:
(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))))
Agora o raciocínio:
As fórmulas incorporadas entre os delimitadores $ são sintaxe tipificada pelo modo de bloqueio de fonte (como Kirill já apontou). O registro dessa fonte parece normal (consulte variável font-lock-syntactic-face-function
e função font-latex-syntactic-face-function
). Mas, describe-char
nos caracteres de uma fórmula incorporada, mostra que a fonte sintática usa a face
propriedade -propriedade em vez da font-lock-face
-propriedade.
O que se segue é hipotético, pois não compreendo completamente o mecanismo de bloqueio de fonte que é bastante complexo.
Parece que face
é mais forte que font-lock-face
. Usos delimitadores de arco-íris font-lock-face
que são dominados pela face
fonte sintática. No entanto, temos a vantagem de que a fonte sintática vem primeiro antes da fonte (palavra-chave) baseada em pesquisa (palavra-chave) que, por sua vez, usa jit-lock (consulte as páginas de informações de font-lock-mode
).
Isso me leva à conclusão de que o problema será resolvido se usarmos face
em rainbow-delimiters
vez de font-lock-face
. E aqui eu não conheço todas as consequências. Mas, como rainbow-delimiters
também usa jit-lock
diretamente (e não completamente font-lock-mode
), estamos em um piso instável de qualquer maneira.
Observe que eu já tive algum contato rainbow-delimiters
(consulte /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ), mas não com rainbow-blocks
. Porque tenho apenas um período limitado de tempo em que escolhi me concentrar rainbow-delimiters
. Talvez você possa resolver o rainbow-blocks
problema-de maneira semelhante.