Следующее больше похоже на комментарий, так как
- это решает только небольшую часть проблемы (
rainbow-delimiters-mode)
- это не полностью проверено (только с одним латексным файлом)
- Я не совсем понимаю, почему это работает (
font-lock-modeэто действительно довольно сложный механизм)
Сначала решение для rainbow-delimiters-mode:
Заменим свойство text font-lock-faceна facein 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))))
Теперь рассуждения:
Внедренные формулы между $ -delimiters имеют синтаксис, обозначенный font-lock-mode (как уже указывал Кирилл). Регистрация этого шрифта выглядит нормально (см. Переменную font-lock-syntactic-face-functionи функцию font-latex-syntactic-face-function). Но describe-charна символах встроенной формулы видно, что синтаксическая фонификация использует -property faceвместо font-lock-face-property.
Следующее является гипотетическим, так как я не полностью понимаю механизм блокировки шрифтов, который является довольно сложным.
Кажется, что faceсильнее, чем font-lock-face. Радужные разделители используются, в font-lock-faceкоторых преобладает faceсинтаксическая формация. Тем не менее, у нас есть преимущество в том, что синтаксическая фонификация стоит на первом месте перед фонатификацией на основе поиска (по ключевым словам), которая, в свою очередь, использует jit-lock (см. Информационные страницы font-lock-mode).
Это подводит меня к выводу , что проблема решена , если мы используем faceв rainbow-delimitersвместо font-lock-face. И здесь я не знаю всех последствий. Но, так как rainbow-delimitersтакже использует jit-lockнапрямую (а не через font-lock-mode), мы все равно стоим на шатком полу.
Обратите внимание, что я уже имел некоторый контакт с rainbow-delimiters(см. Https://stackoverflow.com/questions/19800243/highlight-first-mismatching-paren/20022030#20022030 ), но не с rainbow-blocks. Поскольку у меня есть только ограниченный период времени, я решил сконцентрироваться на rainbow-delimiters. Возможно, вы можете решить эту проблему rainbow-blocksаналогичным образом.