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:
parent
c52e26df30
commit
b0d33d4253
1 changed files with 21 additions and 2 deletions
|
|
@ -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)))))))
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue