unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate
       [not found] ` <20220515184546.6304CC01683@vcs2.savannah.gnu.org>
@ 2022-05-15 20:16   ` Stefan Monnier
  2022-05-15 21:10     ` Augusto Stoffel
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2022-05-15 20:16 UTC (permalink / raw)
  To: emacs-devel; +Cc: Augusto Stoffel

>          (when filter
> +          (make-local-variable 'isearch-filter-predicate)
>            (add-function :after-while isearch-filter-predicate filter))

`add-function` is modeled after `add-hook`, so the above
`make-local-variable` would be better replaced with

    (add-function :after-while (local 'isearch-filter-predicate) filter)

[ Of course, that's pure theory.  You'd better test it first.  ]


        Stefan




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

* Re: master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate
  2022-05-15 20:16   ` master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate Stefan Monnier
@ 2022-05-15 21:10     ` Augusto Stoffel
  2022-05-18 18:59       ` Juri Linkov
  0 siblings, 1 reply; 6+ messages in thread
From: Augusto Stoffel @ 2022-05-15 21:10 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, Juri Linkov

[-- Attachment #1: Type: text/plain, Size: 592 bytes --]

On Sun, 15 May 2022 at 16:16, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

>>          (when filter
>> +          (make-local-variable 'isearch-filter-predicate)
>>            (add-function :after-while isearch-filter-predicate filter))
>
> `add-function` is modeled after `add-hook`, so the above
> `make-local-variable` would be better replaced with
>
>     (add-function :after-while (local 'isearch-filter-predicate) filter)
>
> [ Of course, that's pure theory.  You'd better test it first.  ]

Yes, I guess that's the right way to approach this.  The attached patch
implements it.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fix-last-change-in-minibuffer-lazy-highlight-setup.patch --]
[-- Type: text/x-patch, Size: 2173 bytes --]

From 6699f0b1313f475e83757dc954ee59c8171e9500 Mon Sep 17 00:00:00 2001
From: Augusto Stoffel <arstoffel@gmail.com>
Date: Sun, 15 May 2022 22:48:50 +0200
Subject: [PATCH] Fix last change in minibuffer-lazy-highlight-setup

* lisp/isearch.el (minibuffer-lazy-highlight-setup): Apply advices
buffer-locally.
---
 lisp/isearch.el | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/lisp/isearch.el b/lisp/isearch.el
index 3e1dab4d15..31fbdf01bf 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -4410,14 +4410,17 @@ minibuffer-lazy-highlight-setup
     (let ((unwind (make-symbol "minibuffer-lazy-highlight--unwind"))
           (after-change (make-symbol "minibuffer-lazy-highlight--after-change"))
           (display-count (make-symbol "minibuffer-lazy-highlight--display-count"))
+          (buffer (current-buffer))
           overlay)
       (fset unwind
             (lambda ()
-              (remove-function isearch-filter-predicate filter)
+              (when filter
+                (with-current-buffer buffer
+                  (remove-function (local 'isearch-filter-predicate) filter)))
               (remove-hook 'lazy-count-update-hook display-count)
               (when overlay (delete-overlay overlay))
-              (remove-hook 'after-change-functions after-change)
-              (remove-hook 'minibuffer-exit-hook unwind)
+              (remove-hook 'after-change-functions after-change t)
+              (remove-hook 'minibuffer-exit-hook unwind t)
               (let ((lazy-highlight-cleanup cleanup))
                 (lazy-highlight-cleanup))))
       (fset after-change
@@ -4447,8 +4450,8 @@ minibuffer-lazy-highlight-setup
           (setq overlay (make-overlay (point-min) (point-min) (current-buffer) t))
           (add-hook 'lazy-count-update-hook display-count))
         (when filter
-          (make-local-variable 'isearch-filter-predicate)
-          (add-function :after-while isearch-filter-predicate filter))
+          (with-current-buffer buffer
+            (add-function :after-while (local 'isearch-filter-predicate) filter)))
         (funcall after-change nil nil nil)))))
 
 \f
-- 
2.36.1


[-- Attachment #3: Type: text/plain, Size: 435 bytes --]


Now, I had tried it earlier and noticed something looked fishy.  Now I
can reproduce the problem:

1. With an active region, call C-M-%
2. Switch from the minibuffer back to the original buffer
3. Call keyboard-escape-quit (maybe twice) to quit the minibuffer
   prompt.

Then the buffer-local value of `isearch-filter-predicate' is not cleaned
up.  Is it by any chance intentional that minibuffer-exit-hook doesn't
run in this case?

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

* Re: master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate
  2022-05-15 21:10     ` Augusto Stoffel
@ 2022-05-18 18:59       ` Juri Linkov
  2022-05-18 20:51         ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Juri Linkov @ 2022-05-18 18:59 UTC (permalink / raw)
  To: Augusto Stoffel; +Cc: Stefan Monnier, emacs-devel

>> `add-function` is modeled after `add-hook`, so the above
>> `make-local-variable` would be better replaced with
>>
>>     (add-function :after-while (local 'isearch-filter-predicate) filter)
>>
>> [ Of course, that's pure theory.  You'd better test it first.  ]
>
> Yes, I guess that's the right way to approach this.  The attached patch
> implements it.

Thanks, pushed.

> Now, I had tried it earlier and noticed something looked fishy.  Now I
> can reproduce the problem:
>
> 1. With an active region, call C-M-%
> 2. Switch from the minibuffer back to the original buffer
> 3. Call keyboard-escape-quit (maybe twice) to quit the minibuffer
>    prompt.
>
> Then the buffer-local value of `isearch-filter-predicate' is not cleaned
> up.  Is it by any chance intentional that minibuffer-exit-hook doesn't
> run in this case?

Indeed, a buffer-local minibuffer-exit-hook is not called
when the minibuffer is exited outside of the minibuffer.

This problem exists for all existing uses of buffer-local
minibuffer-exit-hook.  For example, in 'string-rectangle':

1. activate a rectangular region
2. type 'C-x r t'
3. enter a string in the minibuffer
4. switch to the original buffer
5. call keyboard-escape-quit twice

The temporary review content of the rectangle is not erased
by rectangle--string-erase-preview from minibuffer-exit-hook.



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

* Re: master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate
  2022-05-18 18:59       ` Juri Linkov
@ 2022-05-18 20:51         ` Stefan Monnier
  2022-05-19 16:20           ` Juri Linkov
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2022-05-18 20:51 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Augusto Stoffel, emacs-devel

Juri Linkov [2022-05-18 21:59:04] wrote:

>>> `add-function` is modeled after `add-hook`, so the above
>>> `make-local-variable` would be better replaced with
>>>
>>>     (add-function :after-while (local 'isearch-filter-predicate) filter)
>>>
>>> [ Of course, that's pure theory.  You'd better test it first.  ]
>>
>> Yes, I guess that's the right way to approach this.  The attached patch
>> implements it.
>
> Thanks, pushed.
>
>> Now, I had tried it earlier and noticed something looked fishy.  Now I
>> can reproduce the problem:
>>
>> 1. With an active region, call C-M-%
>> 2. Switch from the minibuffer back to the original buffer
>> 3. Call keyboard-escape-quit (maybe twice) to quit the minibuffer
>>    prompt.
>>
>> Then the buffer-local value of `isearch-filter-predicate' is not cleaned
>> up.  Is it by any chance intentional that minibuffer-exit-hook doesn't
>> run in this case?
>
> Indeed, a buffer-local minibuffer-exit-hook is not called
> when the minibuffer is exited outside of the minibuffer.

Looks like a bug.
How 'bout the patch below?


        Stefan


diff --git a/src/minibuf.c b/src/minibuf.c
index df82bcb121a..ac48d0f4714 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -265,7 +265,7 @@ DEFUN ("set-minibuffer-window", Fset_minibuffer_window,
 
 static void read_minibuf_unwind (void);
 static void minibuffer_unwind (void);
-static void run_exit_minibuf_hook (void);
+static void run_exit_minibuf_hook (Lisp_Object minibuf);
 
 
 /* Read a Lisp object from VAL and return it.  If VAL is an empty
@@ -749,7 +749,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
      separately from read_minibuf_unwind because we need to make sure that
      read_minibuf_unwind is fully executed even if exit-minibuffer-hook
      signals an error.  --Stef  */
-  record_unwind_protect_void (run_exit_minibuf_hook);
+  record_unwind_protect (run_exit_minibuf_hook, Fcurrent_buffer ());
 
   /* Now that we can restore all those variables, start changing them.  */
 
@@ -1076,9 +1076,13 @@ get_minibuffer (EMACS_INT depth)
 }
 
 static void
-run_exit_minibuf_hook (void)
+run_exit_minibuf_hook (Lisp_Object minibuf)
 {
+  specpdl_ref count = SPECPDL_INDEX ();
+  record_unwind_current_buffer ();
+  Fset_buffer (minibuf);
   safe_run_hooks (Qminibuffer_exit_hook);
+  unbind_to (count, Qnil);
 }
 
 /* This variable records the expired minibuffer's frame between the




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

* Re: master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate
  2022-05-18 20:51         ` Stefan Monnier
@ 2022-05-19 16:20           ` Juri Linkov
  2022-05-22 14:40             ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Juri Linkov @ 2022-05-19 16:20 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Augusto Stoffel, emacs-devel

>>> 1. With an active region, call C-M-%
>>> 2. Switch from the minibuffer back to the original buffer
>>> 3. Call keyboard-escape-quit (maybe twice) to quit the minibuffer
>>>    prompt.
>>>
>>> Then the buffer-local value of `isearch-filter-predicate' is not cleaned
>>> up.  Is it by any chance intentional that minibuffer-exit-hook doesn't
>>> run in this case?
>>
>> Indeed, a buffer-local minibuffer-exit-hook is not called
>> when the minibuffer is exited outside of the minibuffer.
>
> Looks like a bug.
> How 'bout the patch below?

Alas, it even breaks exiting the minibuffer directly from the minibuffer.

> -  record_unwind_protect_void (run_exit_minibuf_hook);
> +  record_unwind_protect (run_exit_minibuf_hook, Fcurrent_buffer ());

After a little debugging I see that everything is fixed after replacing
'Fcurrent_buffer ()' with 'minibuffer':

     record_unwind_protect (run_exit_minibuf_hook, minibuffer);



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

* Re: master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate
  2022-05-19 16:20           ` Juri Linkov
@ 2022-05-22 14:40             ` Stefan Monnier
  0 siblings, 0 replies; 6+ messages in thread
From: Stefan Monnier @ 2022-05-22 14:40 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Augusto Stoffel, emacs-devel

>> How 'bout the patch below?
> Alas, it even breaks exiting the minibuffer directly from the minibuffer.
>> -  record_unwind_protect_void (run_exit_minibuf_hook);
>> +  record_unwind_protect (run_exit_minibuf_hook, Fcurrent_buffer ());
> After a little debugging I see that everything is fixed after replacing
> 'Fcurrent_buffer ()' with 'minibuffer':
>      record_unwind_protect (run_exit_minibuf_hook, minibuffer);

Duh, indeed, I misread the code, thanks for doing my debugging for me.
Pushed to `master`.


        Stefan




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

end of thread, other threads:[~2022-05-22 14:40 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <165264034407.21518.7194358780844409479@vcs2.savannah.gnu.org>
     [not found] ` <20220515184546.6304CC01683@vcs2.savannah.gnu.org>
2022-05-15 20:16   ` master 2b3f3d421a: Make minibuffer lazy highlight setup buffer-local where appropriate Stefan Monnier
2022-05-15 21:10     ` Augusto Stoffel
2022-05-18 18:59       ` Juri Linkov
2022-05-18 20:51         ` Stefan Monnier
2022-05-19 16:20           ` Juri Linkov
2022-05-22 14:40             ` 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).