emacs-devel
[Top][All Lists]
Advanced

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

minibuffer.el completion bug with markers


From: Jorgen Schaefer
Subject: minibuffer.el completion bug with markers
Date: Sat, 21 Sep 2013 21:34:21 +0200

Hello!
The recent changes to minibuffer.el broke completion functions when
they use markers to define where the completed text starts and ends.

Reproduction:

(with-temp-buffer
  (cl-flet ((test/completion-at-point ()
               (list (copy-marker (point-min))
                     (copy-marker (point))
                     'test/completion-table))
            (test/completion-table (string pred action)
               (if (eq action 'lambda)
                   nil
                 "test: ")))
    (let ((completion-at-point-functions '(test/completion-at-point)))
      (insert "TEST")
      (completion-at-point)
      (assert (equal (buffer-string)
                     "test: ")))))

This errors out in `completion--replace' because the call to
`delete-region' calculates the end point to delete based on (- end
beg), where end can have moved at this point due to the insertion of
text using `insert-and-inherit'. Simple fix:

--- lisp/minibuffer.el  2013-09-16 19:09:24 +0000                               
+++ lisp/minibuffer.el  2013-09-21 19:26:47 +0000                               
@@ -873,8 +873,9 @@
       (setq end (- end suffix-len))                                            
       (setq newtext (substring newtext 0 (- suffix-len))))                     
     (goto-char beg)                                                            
-    (insert-and-inherit newtext)                                               
-    (delete-region (point) (+ (point) (- end beg)))                            
+    (let ((length (- end beg)))                                                
+      (insert-and-inherit newtext)                                             
+      (delete-region (point) (+ (point) length)))                              
     (forward-char suffix-len)))                                                
                                                                                
 (defcustom completion-cycle-threshold nil                                      


Regards,
Jorgen



reply via email to

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