Mercurial > emacs
changeset 110832:0eedefa853ee
* lisp/minibuffer.el (completion--replace): Better preserve markers.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Fri, 01 Oct 2010 01:05:26 +0200 |
parents | 74ecb389545a |
children | 5481007b7ce9 |
files | lisp/ChangeLog lisp/minibuffer.el |
diffstat | 2 files changed, 28 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Thu Sep 30 21:48:25 2010 +0900 +++ b/lisp/ChangeLog Fri Oct 01 01:05:26 2010 +0200 @@ -1,3 +1,8 @@ +2010-09-30 Stefan Monnier <monnier@iro.umontreal.ca> + + * minibuffer.el (completion--replace): + Better preserve markers (bug#7138). + 2010-09-29 Juanma Barranquero <lekktu@gmail.com> * server.el (server-process-filter): Doc fix. @@ -10,8 +15,8 @@ * Makefile.in (ELCFILES): Update. - * emacs-lisp/byte-opt.el (byte-optimize-form-code-walker): Avoid - infinite recursion on erroneous lambda form. (Bug#7114) + * emacs-lisp/byte-opt.el (byte-optimize-form-code-walker): + Avoid infinite recursion on erroneous lambda form. (Bug#7114) 2010-09-27 Kenichi Handa <handa@m17n.org>
--- a/lisp/minibuffer.el Thu Sep 30 21:48:25 2010 +0900 +++ b/lisp/minibuffer.el Fri Oct 01 01:05:26 2010 +0200 @@ -475,10 +475,30 @@ (defun completion--replace (beg end newtext) "Replace the buffer text between BEG and END with NEWTEXT. Moves point to the end of the new text." - ;; This should be in subr.el. + ;; Maybe this should be in subr.el. ;; You'd think this is trivial to do, but details matter if you want ;; to keep markers "at the right place" and be robust in the face of ;; after-change-functions that may themselves modify the buffer. + (let ((prefix-len 0)) + ;; Don't touch markers in the shared prefix (if any). + (while (and (< prefix-len (length newtext)) + (< (+ beg prefix-len) end) + (eq (char-after (+ beg prefix-len)) + (aref newtext prefix-len))) + (setq prefix-len (1+ prefix-len))) + (unless (zerop prefix-len) + (setq beg (+ beg prefix-len)) + (setq newtext (substring newtext prefix-len)))) + (let ((suffix-len 0)) + ;; Don't touch markers in the shared suffix (if any). + (while (and (< suffix-len (length newtext)) + (< beg (- end suffix-len)) + (eq (char-before (- end suffix-len)) + (aref newtext (- (length newtext) suffix-len 1)))) + (setq suffix-len (1+ suffix-len))) + (unless (zerop suffix-len) + (setq end (- end suffix-len)) + (setq newtext (substring newtext 0 (- suffix-len))))) (goto-char beg) (insert newtext) (delete-region (point) (+ (point) (- end beg))))