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)
Другие вопросы по тегам