branch: externals/polymode
commit 448e3abf4fa1efc9c319a7f26c2f781b82242f91
Author: Vitalie Spinu <spinu...@gmail.com>
Commit: Vitalie Spinu <spinu...@gmail.com>

    Move overlays by default, but copy selectively.
---
 polymode-core.el | 35 +++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/polymode-core.el b/polymode-core.el
index fc7a3714ee..b0a8e2ba64 100644
--- a/polymode-core.el
+++ b/polymode-core.el
@@ -1156,21 +1156,40 @@ switch."
     (pm--run-hooks pm/polymode 'switch-buffer-functions old-buffer new-buffer)
     (pm--run-hooks pm/chunkmode 'switch-buffer-functions old-buffer 
new-buffer)))
 
+
+(defvar polymode-copy-overlays-with-these-properties-from-old-buffer 
'(invisible)
+  "Overlays with these non-nil properties should be copied instead of moved.")
+
 (defun pm--move-overlays (from-buffer to-buffer)
   "Delete all overlays in TO-BUFFER, then copy FROM-BUFFER overlays to it."
-  ;; We cannot simply move overlays from one buffer to the antoher as this 
would alter the
-  ;; display of the buffer in another window (see #348 for an example with org 
mode).
-  (delete-all-overlays to-buffer)
+  ;; Some overlays need to be copied to avoid changing the display in other 
windows
+  ;; which display same polymode buffer
+  ;; #348 for an example where overaly with invisible property should be copied
+  ;; #350 for examples where overlays should be moved (most of them)
+
+  ;; Ensure that the overlays which we will copy are not already there in the 
to-buffer.
+  (with-current-buffer to-buffer
+    (mapc (lambda (o)
+            (when
+                (cl-some (lambda (p) (overlay-get o p))
+                         
polymode-copy-overlays-with-these-properties-from-old-buffer)
+              (delete-overlay o)))
+          (overlays-in 1 (1+ (buffer-size)))))
+
   (with-current-buffer from-buffer
     (mapc (lambda (o)
             (unless (or (overlay-get o 'linum-str)
                         (overlay-get o 'yas--snippet)
                         (memq (overlay-get o 'face) '(region show-paren-match 
hl-line)))
-              (let ((o-copy (copy-overlay o))
-                    (start (overlay-start o))
-                    (end (overlay-end o)))
-                (move-overlay o-copy start end  to-buffer))))
-          (overlays-in 1 (1+ (buffer-size))))))
+              (if (cl-some (lambda (p) (overlay-get o p))
+                           
polymode-copy-overlays-with-these-properties-from-old-buffer)
+                  (let ((o-copy (copy-overlay o))
+                        (start (overlay-start o))
+                        (end (overlay-end o)))
+                    (move-overlay o-copy start end  to-buffer))
+                (move-overlay o (overlay-start o) (overlay-end o) to-buffer))))
+          (overlays-in 1 (1+ (buffer-size)))))
+  )
 
 (defun pm--move-vars (vars from-buffer &optional to-buffer)
   (let ((to-buffer (or to-buffer (current-buffer))))

Reply via email to