branch: elpa/adoc-mode
commit f40718c735d69bd3efbe91b05b7949e4181b0504
Author: Bozhidar Batsov <[email protected]>
Commit: Bozhidar Batsov <[email protected]>
[Fix #54] Fix multiline font-lock for inline formatting
Add adoc-font-lock-extend-region to font-lock-extend-region-functions
which extends the fontification region to paragraph boundaries. This
ensures that multiline inline constructs (like __italic spanning
multiple lines__) are properly fontified by jit-lock, which otherwise
may chunk the buffer at line boundaries and miss multiline matches.
---
CHANGELOG.md | 1 +
adoc-mode.el | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f0a0abf796..7d2815c89d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@
- Fix backquote/comma usage in `adoc-kw-inline-macro` so `textprops` is
properly substituted.
- Fix duplicate `face` key in `adoc-kw-delimited-block` plist.
- [#57](https://github.com/bbatsov/adoc-mode/issues/57): Fix Emacs hang on
escaped curly braces in attribute reference regex.
+- [#54](https://github.com/bbatsov/adoc-mode/issues/54): Fix multiline
font-lock for inline formatting by extending fontification region to paragraph
boundaries.
## 0.7.0 (2023-03-09)
diff --git a/adoc-mode.el b/adoc-mode.el
index 0a57a69af7..670c51f124 100644
--- a/adoc-mode.el
+++ b/adoc-mode.el
@@ -2185,6 +2185,29 @@ Use this function as matching function MATCHER in
`font-lock-keywords'."
(put-text-property beg next 'display nil))
(setq beg next)))))
+(defvar font-lock-beg)
+(defvar font-lock-end)
+
+(defun adoc-font-lock-extend-region ()
+ "Extend the font-lock region to paragraph boundaries.
+Inline formatting in AsciiDoc can span multiple lines within a
+paragraph, so the fontification region must cover complete paragraphs
+for multiline constructs to be matched."
+ (let ((changed nil))
+ (save-excursion
+ (goto-char font-lock-beg)
+ (let ((new-beg (progn (backward-paragraph) (point))))
+ (when (< new-beg font-lock-beg)
+ (setq font-lock-beg new-beg
+ changed t))))
+ (save-excursion
+ (goto-char font-lock-end)
+ (let ((new-end (progn (forward-paragraph) (point))))
+ (when (> new-end font-lock-end)
+ (setq font-lock-end new-end
+ changed t))))
+ changed))
+
(defun adoc-font-lock-mark-block-function ()
(mark-paragraph 2)
(forward-paragraph -1))
@@ -3737,6 +3760,7 @@ Turning on Adoc mode runs the normal hook
`adoc-mode-hook'."
(setq-local font-lock-extra-managed-props '(adoc-reserved
adoc-attribute-list adoc-code-block adoc-flyspell-ignore))
(setq-local font-lock-unfontify-region-function
'adoc-unfontify-region-function)
(setq-local font-lock-extend-after-change-region-function
#'adoc-font-lock-extend-after-change-region)
+ (add-hook 'font-lock-extend-region-functions #'adoc-font-lock-extend-region
nil t)
;; outline mode
(setq-local outline-regexp "=\\{1,5\\}[ \t]+[^ \t\n]")