From 219bc6c2d3d3f794b9e5d8393f51653ba1602396 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Sun, 6 Feb 2022 19:52:42 +0800 Subject: [PATCH] org-fold-core-fontify-region: Fix cases when fontification is not registered * lisp/org-fold-core.el (org-fold-core-fontify-region): Handle FORCE argument better. Skip unnecessary code parts when FORCE is non-nil. Assign `fontified' text property manually in the actually fontified regions. We cannot just supply correct return value since jit-lock does not allow piecewise fontification. --- lisp/org-fold-core.el | 51 +++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/lisp/org-fold-core.el b/lisp/org-fold-core.el index edae316ff..d98eb6358 100644 --- a/lisp/org-fold-core.el +++ b/lisp/org-fold-core.el @@ -1436,40 +1436,43 @@ folded regions.") (defun org-fold-core-fontify-region (beg end loudly &optional force) "Run `font-lock-default-fontify-region' in visible regions." (with-silent-modifications - (let ((pos beg) next - (force (or force org-fold-core--force-fontification)) - (org-fold-core--fontifying t) - (skip-specs - (let (result) - (dolist (spec (org-fold-core-folding-spec-list)) - (when (and (not (org-fold-core-get-folding-spec-property spec :visible)) - (org-fold-core-get-folding-spec-property spec :font-lock-skip)) - (push spec result))) - result))) + (let* ((pos beg) next + (force (or force org-fold-core--force-fontification)) + (org-fold-core--fontifying t) + (skip-specs + (unless force + (let (result) + (dolist (spec (org-fold-core-folding-spec-list)) + (when (and (not (org-fold-core-get-folding-spec-property spec :visible)) + (org-fold-core-get-folding-spec-property spec :font-lock-skip)) + (push spec result))) + result)))) ;; Move POS to first visible point within BEG..END. - (while (and (catch :found - (dolist (spec (org-fold-core-get-folding-spec 'all pos)) - (when (org-fold-core-get-folding-spec-property spec :font-lock-skip) - (throw :found spec)))) - (< pos end)) - (setq pos (org-fold-core-next-folding-state-change nil pos end))) + (unless force + (while (and (catch :found + (dolist (spec (org-fold-core-get-folding-spec 'all pos)) + (when (org-fold-core-get-folding-spec-property spec :font-lock-skip) + (throw :found spec)))) + (< pos end)) + (setq pos (org-fold-core-next-folding-state-change nil pos end)))) (when force (setq pos beg next end)) (while (< pos end) (unless force - (setq next (org-fold-core-next-folding-state-change skip-specs pos end))) - ;; Move to the end of the region to be fontified. - (while (and (not (catch :found - (dolist (spec (org-fold-core-get-folding-spec 'all next)) - (when (org-fold-core-get-folding-spec-property spec :font-lock-skip) - (throw :found spec))))) - (< next end)) - (setq next (org-fold-core-next-folding-state-change nil next end))) + (setq next (org-fold-core-next-folding-state-change skip-specs pos end)) + ;; Move to the end of the region to be fontified. + (while (and (not (catch :found + (dolist (spec (org-fold-core-get-folding-spec 'all next)) + (when (org-fold-core-get-folding-spec-property spec :font-lock-skip) + (throw :found spec))))) + (< next end)) + (setq next (org-fold-core-next-folding-state-change nil next end)))) (save-excursion (font-lock-default-fontify-region pos next loudly) (save-match-data (unless (<= pos (point) next) (run-hook-with-args 'org-fold-core-first-unfold-functions pos next)))) (put-text-property pos next 'org-fold-core-fontified t) + (put-text-property pos next 'fontified t) (setq pos next))))) (defun org-fold-core-update-optimisation (beg end)