1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Don't squash markers in occur-edit-mode

* 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.
This commit is contained in:
Mattias Engdegård 2021-07-25 11:24:53 +02:00
parent c52e26df30
commit b0d33d4253

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