emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 5c18d35: Improve overlay placement performance


From: Tassilo Horn
Subject: master 5c18d35: Improve overlay placement performance
Date: Fri, 10 Sep 2021 18:08:29 -0400 (EDT)

branch: master
commit 5c18d35acba751b2011d6746cf9c3c781e88db73
Author: Tassilo Horn <tsdh@gnu.org>
Commit: Tassilo Horn <tsdh@gnu.org>

    Improve overlay placement performance
    
    * lisp/progmodes/bug-reference.el (bug-reference--overlays-in): New
    function.
    (bug-reference-unfontify): Use it.
    (bug-reference-fontify): Reuse and move existing overlays instead of
    deleting all and creating them anew.
---
 lisp/progmodes/bug-reference.el | 45 +++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 15 deletions(-)

diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index 3354834..586d4ee 100644
--- a/lisp/progmodes/bug-reference.el
+++ b/lisp/progmodes/bug-reference.el
@@ -105,21 +105,27 @@ highlighted, too."
 
 (bug-reference-set-overlay-properties)
 
+(defun bug-reference--overlays-in (start end)
+  "Return bug reference overlays in the region between START and END."
+  (let (overlays)
+    (dolist (o (overlays-in start end))
+      (when (eq (overlay-get o 'category) 'bug-reference)
+        (push o overlays)))
+    (nreverse overlays)))
+
 (defun bug-reference-unfontify (start end)
   "Remove bug reference overlays from the region between START and END."
-  (dolist (o (overlays-in start end))
-    (when (eq (overlay-get o 'category) 'bug-reference)
-      (delete-overlay o))))
+  (mapc #'delete-overlay (bug-reference--overlays-in start end)))
 
 (defvar bug-reference-prog-mode)
 
 (defun bug-reference-fontify (start end)
   "Apply bug reference overlays to the region between START and END."
   (save-excursion
-    (let ((beg-line (progn (goto-char start) (line-beginning-position)))
-         (end-line (progn (goto-char end) (line-end-position))))
-      ;; Remove old overlays.
-      (bug-reference-unfontify beg-line end-line)
+    (let* ((beg-line (progn (goto-char start) (line-beginning-position)))
+          (end-line (progn (goto-char end) (line-end-position)))
+           ;; Reuse existing overlays overlays.
+           (overlays (bug-reference--overlays-in beg-line end-line)))
       (goto-char beg-line)
       (while (and (< (point) end-line)
                  (re-search-forward bug-reference-bug-regexp end-line 'move))
@@ -129,19 +135,28 @@ highlighted, too."
           ;; We highlight the 99th subexpression if that exists,
           ;; otherwise the complete match.  See the docstring of
           ;; `bug-reference-bug-regexp'.
-         (let ((overlay (make-overlay (or (match-beginning 99)
-                                           (match-beginning 0))
-                                       (or (match-end 99)
-                                           (match-end 0))
-                                      nil t nil)))
-           (overlay-put overlay 'category 'bug-reference)
-           ;; Don't put a link if format is undefined
+         (let* ((s (or (match-beginning 99)
+                        (match-beginning 0)))
+                 (e (or (match-end 99)
+                        (match-end 0)))
+                 (overlay (or
+                           (let ((ov (pop overlays)))
+                             (when ov
+                               (move-overlay ov s e)
+                               ov))
+                           (let ((ov (make-overlay s e nil t nil)))
+                             (overlay-put ov 'category 'bug-reference)
+                             ov))))
+           ;; Don't put a link if format is undefined.
            (when bug-reference-url-format
               (overlay-put overlay 'bug-reference-url
                            (if (stringp bug-reference-url-format)
                                (format bug-reference-url-format
                                        (match-string-no-properties 2))
-                             (funcall bug-reference-url-format))))))))))
+                             (funcall bug-reference-url-format)))))))
+      ;; Delete remaining but unused overlays.
+      (dolist (ov overlays)
+        (delete-overlay ov)))))
 
 ;; Taken from button.el.
 (defun bug-reference-push-button (&optional pos _use-mouse-action)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]