emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[nongnu] elpa/idris-mode 71ab6a35e3 5/9: [semantic-highlight] Remove and


From: ELPA Syncer
Subject: [nongnu] elpa/idris-mode 71ab6a35e3 5/9: [semantic-highlight] Remove and rebuild overlays in file on reload only in changed area
Date: Tue, 6 Dec 2022 05:59:06 -0500 (EST)

branch: elpa/idris-mode
commit 71ab6a35e3ed83ddc17919185f576b0a4e2fbeaa
Author: Marek L <nospam.keram@gmail.com>
Commit: Marek L <nospam.keram@gmail.com>

    [semantic-highlight] Remove and rebuild overlays in file on reload  only in 
changed area
    
    Why:
    Currently when file is reloaded to Idris
    all overlays are removed from buffer and added back later.
    This causes flashing and bad user experience.
    After change only overlays in changed area are removed and redrawn.
---
 idris-commands.el        |  2 --
 idris-highlight-input.el | 53 ++++++++++++++++++++++++++++++------------------
 2 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/idris-commands.el b/idris-commands.el
index 9b8eb7ee32..54f558b19a 100644
--- a/idris-commands.el
+++ b/idris-commands.el
@@ -209,8 +209,6 @@ A prefix argument forces loading but only up to the current 
line."
         (when (get-buffer idris-notes-buffer-name)
           (with-current-buffer idris-notes-buffer-name
             (let ((inhibit-read-only t)) (erase-buffer))))
-        ;; Remove stale semantic highlighting
-        (idris-highlight-remove-overlays (current-buffer))
         ;; Actually do the loading
         (let* ((dir-and-fn (idris-filename-to-load))
                (fn (cdr dir-and-fn))
diff --git a/idris-highlight-input.el b/idris-highlight-input.el
index 521e4b0399..ec9aaaab67 100644
--- a/idris-highlight-input.el
+++ b/idris-highlight-input.el
@@ -57,32 +57,45 @@ See Info node `(elisp)Overlay Properties' to understand how 
ARGS are used."
 (defun idris-highlight-input-region (buffer start-line start-col end-line 
end-col highlight)
   "Highlight in BUFFER using an overlay from START-LINE and START-COL to
  END-LINE and END-COL and the semantic properties specified in HIGHLIGHT."
-  (when idris-semantic-source-highlighting
-    (save-restriction
-      (widen)
-      (if (or (> end-line start-line)
-              (and (= end-line start-line)
-                   (> end-col start-col)))
-          (with-current-buffer buffer
+  (if (or (> end-line start-line)
+          (and (= end-line start-line)
+               (> end-col start-col)))
+      (when idris-semantic-source-highlighting
+        (with-current-buffer buffer
+          (save-restriction
+            (widen)
             (save-excursion
               (goto-char (point-min))
               (let* ((start-pos (+ (line-beginning-position start-line)
                                    (idris-highlight-column start-col)))
                      (end-pos (+ (line-beginning-position end-line)
                                  (idris-highlight-column end-col)))
-                     (highlight-overlay (make-overlay start-pos end-pos
-                                                      (get-buffer buffer))))
-                (overlay-put highlight-overlay 'idris-source-highlight t)
-                (idris-add-overlay-properties highlight-overlay
-                                              (idris-semantic-properties 
highlight))
-                (overlay-put highlight-overlay
-                             'modification-hooks
-                             '(idris-highlight--overlay-modification-hook)))))
-        (when (eq idris-semantic-source-highlighting 'debug)
-          (message "Not highlighting absurd span %s:%s-%s:%s with %s"
-                   start-line start-col
-                   end-line end-col
-                   highlight ))))))
+                     (existing-idris-overlays-in-range (seq-filter
+                                                        (lambda (overlay)
+                                                          (overlay-get overlay 
'idris-source-highlight))
+                                                        (overlays-in start-pos 
end-pos)))
+                     (existing-idris-overlay (seq-find (lambda (overlay)
+                                                         (and
+                                                          (eql start-pos 
(overlay-start overlay))
+                                                          (eql end-pos 
(overlay-end overlay))
+                                                          ;; TODO: overlay 
properties match
+                                                          ))
+                                                       
existing-idris-overlays-in-range)))
+                (when (null existing-idris-overlay)
+                  (dolist (old-overlay existing-idris-overlays-in-range)
+                    (delete-overlay old-overlay))
+                  (let ((highlight-overlay (make-overlay start-pos end-pos)))
+                    (overlay-put highlight-overlay 'idris-source-highlight t)
+                    (idris-add-overlay-properties highlight-overlay
+                                                  (idris-semantic-properties 
highlight))
+                    (overlay-put highlight-overlay
+                                 'modification-hooks
+                                 
'(idris-highlight--overlay-modification-hook)))))))))
+    (when (eq idris-semantic-source-highlighting 'debug)
+      (message "Not highlighting absurd span %s:%s-%s:%s with %s"
+               start-line start-col
+               end-line end-col
+               highlight))))
 
 (defun idris-highlight-source-file (hs)
   (cl-loop



reply via email to

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