GNU bug report logs - #49963
28.0.50; isearch failing in Dired after rectangle-mark-mode and query-replace

Previous Next

Package: emacs;

Reported by: laslydone <laslydone <at> protonmail.com>

Date: Mon, 9 Aug 2021 16:36:02 UTC

Severity: normal

Tags: fixed

Fixed in version 28.0.50

Done: Juri Linkov <juri <at> linkov.net>

Bug is archived. No further changes may be made.

Full log


Message #8 received at 49963 <at> debbugs.gnu.org (full text, mbox):

From: Juri Linkov <juri <at> linkov.net>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 49963 <at> debbugs.gnu.org, laslydone <laslydone <at> protonmail.com>
Subject: Re: bug#49963: 28.0.50; isearch failing in Dired after
 rectangle-mark-mode and query-replace
Date: Tue, 10 Aug 2021 10:03:39 +0300
>   What happened:
> In Dired isearch-{forward,backward} will no longer match anything after running
> `rectangle-mark-mode' and `query-replace'.
>
>   What I thought would happen:
> In Dired after running `rectangle-mark-mode' and `query-replace',
> isearch-{forward,backward} would match again.
>
>   To reproduce:
> 1. emacs -Q
> 2. C-x d <RET>
> 3. C-x C-q
> 4. C-x <SPC> C-n
> 5. M-% <RET> <RET> (entering nothing)
> 6. ^s (searching for anything will show "Failing I-search: ANYTHING" in minibuffer)

Stefan, please help.  Wdired adds advice on a buffer-local isearch-filter-predicate,
and perform-replace adds advice on a let-bound isearch-filter-predicate
that changes the global value.  This is the minimal test case:

  (add-function :after-while (local 'isearch-filter-predicate)
                (lambda (&rest _) 'filter-local))

  (let ((isearch-filter-predicate isearch-filter-predicate))
    (add-function :after-while isearch-filter-predicate
                  (lambda (&rest _) 'filter-letbound)))

C-h v isearch-filter-predicate:

  Value:
  #f(advice-wrapper :after-while #f(compiled-function
                                    (&rest args)
                                    #<bytecode -0x1d2ab1d0859aebb6>)
                    (closure
                     (t)
                     (&rest _)
                     'filter-local))
  Local in buffer *scratch*; global value is
  #f(advice-wrapper :after-while isearch-filter-visible
                     (closure
                      (t)
                      (&rest _)
                      'filter-letbound))

Let-binding was supposed to protect from changing the global value,
but with a buffer-local value it still changes the global value.




This bug report was last modified 3 years and 286 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.