Emacs: font-lock-fontify-region и multiline
Я пишу второстепенный режим для файлов php/html. Я использую функцию (ср. font-lock-keywords
) чтобы понять <?php
?>
блоки.
Для распознавания многослойных блоков мне нужно установить font-lock-multiline
к т.
Все работает довольно хорошо. Это просто проблема в этом случае: когда у меня есть многострочный блок и удаляем закрывающий тег (?>
) блок неопознан. Когда я возвращаю метку, блок снова не распознается.
У меня три вопроса:
1 / Есть ли простое решение этой проблемы
если нет 2/ есть ли способ вызвать font-lock-fontify-buffer
каждый раз, когда я набираю эти два символа: '?' '>'
3 / лучше, есть ли способ вызвать такого рода функцию: когда я печатаю ?>
Я нахожу открывающий тег <?php
и заставить font-lock-fontify-region
на этом блоке.
1 ответ
Это базовый подход, и логика недостаточна, но он демонстрирует один вариант:
(defvar foo-minor-mode-map (make-keymap) "foo-minor-mode keymap.")
(define-key foo-minor-mode-map (kbd ">") 'foo-electric-gt)
(defun foo-electric-gt (&optional arg)
(interactive "*p")
(when (looking-back "\\?$")
(save-excursion
(let ((end (- (point) 1))
(beg (+ (search-backward "<?php") 5)))
(font-lock-fontify-region beg end))))
(insert-char ?> arg))
(define-minor-mode foo-minor-mode
"foo mode.
\\{foo-minor-mode-map}"
:keymap 'foo-minor-mode-map)