Далі більше нагадує коментар з тих пір
- він вирішує лише невелику частину проблеми (
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-syntactic-face-function
та функцію font-latex-syntactic-face-function
). Але describe-char
на символах вбудованої формули видно, що синтаксична фонтифікація використовує -property face
замість -property font-lock-face
.
Далі гіпотетично, оскільки я не повністю розумію механізм блокування шрифту, який є досить складним.
Здається, що 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
-проблему аналогічним чином.