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))))