]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't squash markers in occur-edit-mode
authorMattias Engdegård <mattiase@acm.org>
Sun, 25 Jul 2021 09:24:53 +0000 (11:24 +0200)
committerMattias Engdegård <mattiase@acm.org>
Sun, 25 Jul 2021 09:24:53 +0000 (11:24 +0200)
* lisp/replace.el (occur-after-change-function): Instead of replacing
the whole line being edited, use shrink-wrapping to replace the
smallest interval encompassing the change.  That way, we avoid
disturbing markers (such as occur highlighting locations) in the line;
they would otherwise all be forced to the beginning.

lisp/replace.el

index 24befed24123827ee6cffeb0f791d630ff9b6461..09bdf28dbce1603b1cc426a4128b2af9057556ce 100644 (file)
@@ -1398,8 +1398,27 @@ To return to ordinary Occur mode, use \\[occur-cease-edit]."
            (recenter line)
            (if readonly
                (message "Buffer `%s' is read only." buf)
-             (delete-region (line-beginning-position) (line-end-position))
-             (insert text))
+              ;; Replace the line, but make the change as small as
+              ;; possible by shrink-wrapping.  That way, we avoid
+              ;; disturbing markers unnecessarily.
+              (let* ((beg-pos (line-beginning-position))
+                     (end-pos (line-end-position))
+                     (buf-str (buffer-substring-no-properties beg-pos end-pos))
+                     (common-prefix
+                      (lambda (s1 s2)
+                        (let ((c (compare-strings s1 nil nil s2 nil nil)))
+                          (if (zerop c)
+                              (length s1)
+                            (1- (abs c))))))
+                     (prefix-len (funcall common-prefix buf-str text))
+                     (suffix-len (funcall common-prefix
+                                          (reverse buf-str) (reverse text))))
+                (setq beg-pos (+ beg-pos prefix-len))
+                (setq end-pos (- end-pos suffix-len))
+                (setq text (substring text prefix-len (- suffix-len)))
+                (delete-region beg-pos end-pos)
+                (goto-char beg-pos)
+                (insert text)))
            (move-to-column col)))))))
 
 \f