unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* minibuffer.el completion bug with markers
@ 2013-09-21 19:34 Jorgen Schaefer
  2013-10-04  2:24 ` Stefan Monnier
  0 siblings, 1 reply; 2+ messages in thread
From: Jorgen Schaefer @ 2013-09-21 19:34 UTC (permalink / raw)
  To: emacs-devel

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



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: minibuffer.el completion bug with markers
  2013-09-21 19:34 minibuffer.el completion bug with markers Jorgen Schaefer
@ 2013-10-04  2:24 ` Stefan Monnier
  0 siblings, 0 replies; 2+ messages in thread
From: Stefan Monnier @ 2013-10-04  2:24 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

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

Thanks, installed.


        Stefan


> (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: ")))))

Thanks for the test, tho it fails.  I think you meant to use `flet'
above rather than `cl-flet'.  Those are quite different (basically,
`flet' provides dynamically scoped definitions, whereas
`cl-flet' provides lexically scoped definitions).


        Stefan



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-10-04  2:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-21 19:34 minibuffer.el completion bug with markers Jorgen Schaefer
2013-10-04  2:24 ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).