emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/emacs-23 r100074: * lisp/minibuffer.el (com


From: Stefan Monnier
Subject: [Emacs-diffs] /srv/bzr/emacs/emacs-23 r100074: * lisp/minibuffer.el (completion--replace): Better preserve markers.
Date: Fri, 01 Oct 2010 01:05:26 +0200
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 100074
committer: Stefan Monnier <address@hidden>
branch nick: emacs-23
timestamp: Fri 2010-10-01 01:05:26 +0200
message:
  * lisp/minibuffer.el (completion--replace): Better preserve markers.
modified:
  lisp/ChangeLog
  lisp/minibuffer.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2010-09-29 13:24:55 +0000
+++ b/lisp/ChangeLog    2010-09-30 23:05:26 +0000
@@ -1,3 +1,8 @@
+2010-09-30  Stefan Monnier  <address@hidden>
+
+       * minibuffer.el (completion--replace):
+       Better preserve markers (bug#7138).
+
 2010-09-29  Juanma Barranquero  <address@hidden>
 
        * 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  <address@hidden>
 

=== modified file 'lisp/minibuffer.el'
--- a/lisp/minibuffer.el        2010-04-20 07:37:20 +0000
+++ b/lisp/minibuffer.el        2010-09-30 23:05:26 +0000
@@ -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))))


reply via email to

[Prev in Thread] Current Thread [Next in Thread]