Subject: Re: bug#25591: 25.1; M-% offers to repeat last search, but forgets that it was a "symbol" search

From: Juri Linkov <[email-masked]>
Date: Wed, 15 Feb 2017 01:11:32 +0200

> Hm, I wasn't aware that M-% interprets the prefix arg to mean "word
> replace".  My instinct says it should honor the explicit C-u.

Even in your example, wouldn't it be confusing if after typing

C-a M-% RET !

and seeing this non-symbol prompt

Query replace (default i → u):

replacement will still be symbol-based
(because the previous replacement was symbol-based)?

To be not confusing the prompt should show explicitly
the replacement type, e.g. in case of symbol replacement:

Query replace symbol (default i → u):

When we'll store the replacement type in the history,
then maybe display previous replacements in the minibuffer like

Query replace (default symbol i → u):

then typing M-p will pull a previous replacement into the minibuffer,
e.g. word-based:

Query replace (default symbol i → u): word foo → bar

where “word” is intangible part of the prompt.

>>> I don't know if this is a bug, but it's disappointing and inconvenient.
>>>
>>> Start emacs with -Q, and type into the *scratch* buffer these 10 characters:
>>>
>>>     I ate this
>>>
>>> Now do C-a to move point to the beginning of the line.
>>>
>>> Now replace the symbol "i" with "u":
>>>
>>>    M-s _ i M-% u RET !
>>>
>>> So far, so good: we are looking at
>>>
>>>    U at this
>>>
>>> which is correct.
>>>
>>> Now try to repeat the replacement:
>>>
>>>    C-a M-% RET !
>>>
>>> This changes the "i" in "this" to a u, even though that "i" isn't an
>>> independent symbol.  I was hoping that it would do nothing.
>>
>> But what if you mistakenly invoked the replacement in wrong mode,
>> and want to repeat the same replacement in the right one?  E.g.
>> first entered replacement strings in regexp replacement mode:
>>
>> C-M-% i RET u RET
>>
>> and then realized you want apply the same replacement strings
>> in word mode:
>>
>> C-u M-% RET
>>
>> Should it perform word replacement as explicitly stated
>> by the prefix arg C-u, or use a previous replacement type
>> (in this case, regexp replacement) remembered in the
>> replacement history?