Subject: Re: bug#12638: 24.2.50; FR: Some suggestions for icomplete-mode

From: Jambunathan K <[email-masked]>
Date: Fri, 02 Nov 2012 17:42:27 +0530

Jambunathan K <[email-masked]> writes:

> 1. `minibuffer-summarize-completions' is meant as a replacement for
>    `icomplete-exhibit'.  As the name suggests, it is meant to go in to
>     minibuffer.el.  It's presence in minibuffer.el proved problematic
>    (details in followup mail) and I had to move it to icomplete.el.

0. In my earlier patch, remove `minibuffer-summarize-completions' from
   icomplete.el and shift it enbloc to minibuffer.el.

   Compile and re-load.  emacs -Q

1. M-x icomplete-mode RET
2. M-x load-1
3. See the following error message echoed.

    ,----
    | Icomplete mode enabled
    | 
    | Error in post-command-hook (#[nil \301\302\303!)\207 [non-essential t
    | run-hooks icomplete-post-command-hook] 2]): (error "Attempt to modify
    | read-only object")
    `----

4. If I grep for the above error text, it happens in 

--8<---------------cut here---------------start------------->8---
-*- mode: grep; default-directory: "~/src/emacs/trunk/src/" -*-
Grep started at Fri Nov  2 17:35:44

find . -type d \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) -prune -o \! -type d \( -name .\#\* -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem -o -name \*.x86f -o -name \*.sparcf -o -name \*.dfsl -o -name \*.pfsl -o -name \*.d64fsl -o -name \*.p64fsl -o -name \*.lx64fsl -o -name \*.lx32fsl -o -name \*.dx64fsl -o -name \*.dx32fsl -o -name \*.fx64fsl -o -name \*.fx32fsl -o -name \*.sx64fsl -o -name \*.sx32fsl -o -name \*.wx64fsl -o -name \*.wx32fsl -o -name \*.fasl -o -name \*.ufsl -o -name \*.fsl -o -name \*.dxl -o -name \*.lo -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) -prune -o  -type f \( -name \*.\[ch\] \) -exec grep  -nH -e Attempt\ to\ modify\ read-only\ object {} +
./data.c:104:  error ("Attempt to modify read-only object");

Grep finished (matches found) at Fri Nov  2 17:35:44
--8<---------------cut here---------------end--------------->8---

which is

--8<---------------cut here---------------start------------->8---
void
pure_write_error (void)
{
  error ("Attempt to modify read-only object");
}
--8<---------------cut here---------------end--------------->8---

this in turn leads to

--8<---------------cut here---------------start------------->8---

-*- mode: grep; default-directory: "~/src/emacs/trunk/src/" -*-
Grep started at Fri Nov  2 17:37:03

find . -type d \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) -prune -o \! -type d \( -name .\#\* -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem -o -name \*.x86f -o -name \*.sparcf -o -name \*.dfsl -o -name \*.pfsl -o -name \*.d64fsl -o -name \*.p64fsl -o -name \*.lx64fsl -o -name \*.lx32fsl -o -name \*.dx64fsl -o -name \*.dx32fsl -o -name \*.fx64fsl -o -name \*.fx32fsl -o -name \*.sx64fsl -o -name \*.sx32fsl -o -name \*.wx64fsl -o -name \*.wx32fsl -o -name \*.fasl -o -name \*.ufsl -o -name \*.fsl -o -name \*.dxl -o -name \*.lo -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) -prune -o  -type f \( -name \*.\[ch\] \) -exec grep  -nH -e CHECK_IMPURE {} +
./puresize.h:74:#define CHECK_IMPURE(obj) \
./intervals.c:104:  CHECK_IMPURE (parent);
./keymap.c:350:	  CHECK_IMPURE (prev);
./keymap.c:852:		CHECK_IMPURE (elt);
./keymap.c:905:		CHECK_IMPURE (elt);
./keymap.c:949:      CHECK_IMPURE (insertion_point);
./data.c:490:  CHECK_IMPURE (cell);
./data.c:500:  CHECK_IMPURE (cell);
./data.c:2120:  CHECK_IMPURE (array);

Grep finished (matches found) at Fri Nov  2 17:37:03

--8<---------------cut here---------------end--------------->8---

I am pretty sure the error happens during `put-overlay' and my suspect
is intervals.c.

,---- from icomplete.el (See `icomplete-exhibit')
| (when (stringp text)
|   (move-overlay icomplete-overlay (point) (point) (current-buffer))
|   ;; The current C cursor code doesn't know to use the overlay's
|   ;; marker's stickiness to figure out whether to place the cursor
|   ;; before or after the string, so let's spoon-feed it the pos.
|   (put-text-property 0 1 'cursor t text) <===========================
|   (overlay-put icomplete-overlay 'after-string text))
`----

Since this happens when the file is in minibuffer.el and the return
values are "string constants", I am suspecting that some config value
has to be bumped somewhere.