* 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).