unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#55768: 26.3; isearch highlighting in dired
@ 2022-06-02 15:22 Thierry EMERY
  2022-06-03  3:31 ` Lars Ingebrigtsen
  0 siblings, 1 reply; 14+ messages in thread
From: Thierry EMERY @ 2022-06-02 15:22 UTC (permalink / raw)
  To: 55768


[-- Attachment #1.1: Type: text/plain, Size: 959 bytes --]

Hello,

isearch fails to highlight in dired and displays the following error:
[image: image.png]

As dired sets text property 'invisible to a symbol, either:
'dired-hide-details-detail, 'dired-hide-details-information or
'dired-hide-details-link, in order for isearch to properly highlight the
searched string in a dired buffer, the following patch ought to be applied
to isearch-range-invisible:
diff -u isearch.el~ isearch.el
--- isearch.el~ 2019-09-10 02:32:49.000000000 +0200
+++ isearch.el 2022-06-02 17:13:55.490492201 +0200
@@ -2972,7 +2972,7 @@
  ;; skip all characters with that same `invisible' property value.
  ;; Do that over and over.
  (while (and (< (point) end) (invisible-p (point)))
-  (if (invisible-p (get-text-property (point) 'invisible))
+  (if (member (get-text-property (point) 'invisible)
buffer-invisibility-spec)
       (progn
  (goto-char (next-single-property-change (point) 'invisible
  nil end))

Kind Regards,

Thierry Emery

[-- Attachment #1.2: Type: text/html, Size: 1238 bytes --]

[-- Attachment #2: image.png --]
[-- Type: image/png, Size: 2580 bytes --]

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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-02 15:22 bug#55768: 26.3; isearch highlighting in dired Thierry EMERY
@ 2022-06-03  3:31 ` Lars Ingebrigtsen
  2022-06-03  7:23   ` Thierry EMERY
  2022-06-03  7:55   ` Juri Linkov
  0 siblings, 2 replies; 14+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-03  3:31 UTC (permalink / raw)
  To: Thierry EMERY; +Cc: 55768, Juri Linkov

Thierry EMERY <thierryalemery@gmail.com> writes:

> isearch fails to highlight in dired and displays the following error:
> image.png

[...]

>   (while (and (< (point) end) (invisible-p (point)))
> -  (if (invisible-p (get-text-property (point) 'invisible))
> +  (if (member (get-text-property (point) 'invisible) buffer-invisibility-spec)

Hm...  shouldn't this just be

> -  (if (invisible-p (point))

?  The previous change was added by Juri; added to the CCs.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-03  3:31 ` Lars Ingebrigtsen
@ 2022-06-03  7:23   ` Thierry EMERY
  2022-06-03  7:42     ` Thierry EMERY
  2022-06-04 11:24     ` Lars Ingebrigtsen
  2022-06-03  7:55   ` Juri Linkov
  1 sibling, 2 replies; 14+ messages in thread
From: Thierry EMERY @ 2022-06-03  7:23 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55768, Juri Linkov

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

(invisible-p (point)) has already been tested in the previous line, but it
only tests that there is a text property, not actual invisibility:
(defun invisible-p (pos)
  (get-text-property pos 'invisible))

If the text property `invisible' has another symbol than t as value and
`buffer-invisibility-spec' is a list (which is the case in dired, see
below), then the text will only be invisible if that symbol is currently
part of `buffer-invisibility-spec' (and that is used by
`dired-hide-details-mode').

buffer-invisibility-spec is a variable defined in ‘C source code’.
Its value is (t)
Local in buffer lisp; global value is t

  Automatically becomes buffer-local when set.

Documentation:
Invisibility spec of this buffer.
The default is t, which means that text is invisible if it has a non-nil
‘invisible’ property.
This variable can also be a list.  The list can have two kinds of elements:
‘ATOM’ and ‘(ATOM . ELLIPSIS)’.  A text character is invisible if its
‘invisible’ property is ‘ATOM’, or has an ‘invisible’ property that is a
list
that contains ‘ATOM’.
If the ‘(ATOM . ELLIPSIS)’ form is used, and ‘ELLIPSIS’ is non-nil, an
ellipsis will be displayed after the invisible characters.
Setting this variable is very fast, much faster than scanning all the text
in
the buffer looking for properties to change.

[-- Attachment #2: Type: text/html, Size: 1536 bytes --]

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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-03  7:23   ` Thierry EMERY
@ 2022-06-03  7:42     ` Thierry EMERY
  2022-06-04 11:24     ` Lars Ingebrigtsen
  1 sibling, 0 replies; 14+ messages in thread
From: Thierry EMERY @ 2022-06-03  7:42 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55768, Juri Linkov

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

Reading the documentation for `buffer-invisibility-spec' more thouroughly,
it now seems to me that a better patch would be:
diff -u isearch.el~ isearch.el
--- isearch.el~ 2019-09-10 02:32:49.000000000 +0200
+++ isearch.el 2022-06-03 09:40:59.991883469 +0200
@@ -2972,7 +2972,8 @@
  ;; skip all characters with that same `invisible' property value.
  ;; Do that over and over.
  (while (and (< (point) end) (invisible-p (point)))
-  (if (invisible-p (get-text-property (point) 'invisible))
+  (if (or (memq (get-text-property (point) 'invisible)
buffer-invisibility-spec)
+  (assq (get-text-property (point) 'invisible) buffer-invisibility-spec))
       (progn
  (goto-char (next-single-property-change (point) 'invisible
  nil end))


Le ven. 3 juin 2022 à 09:23, Thierry EMERY <thierryalemery@gmail.com> a
écrit :

> (invisible-p (point)) has already been tested in the previous line, but it
> only tests that there is a text property, not actual invisibility:
> (defun invisible-p (pos)
>   (get-text-property pos 'invisible))
>
> If the text property `invisible' has another symbol than t as value and
> `buffer-invisibility-spec' is a list (which is the case in dired, see
> below), then the text will only be invisible if that symbol is currently
> part of `buffer-invisibility-spec' (and that is used by
> `dired-hide-details-mode').
>
> buffer-invisibility-spec is a variable defined in ‘C source code’.
> Its value is (t)
> Local in buffer lisp; global value is t
>
>   Automatically becomes buffer-local when set.
>
> Documentation:
> Invisibility spec of this buffer.
> The default is t, which means that text is invisible if it has a non-nil
> ‘invisible’ property.
> This variable can also be a list.  The list can have two kinds of elements:
> ‘ATOM’ and ‘(ATOM . ELLIPSIS)’.  A text character is invisible if its
> ‘invisible’ property is ‘ATOM’, or has an ‘invisible’ property that is a
> list
> that contains ‘ATOM’.
> If the ‘(ATOM . ELLIPSIS)’ form is used, and ‘ELLIPSIS’ is non-nil, an
> ellipsis will be displayed after the invisible characters.
> Setting this variable is very fast, much faster than scanning all the text
> in
> the buffer looking for properties to change.
>
>

[-- Attachment #2: Type: text/html, Size: 2749 bytes --]

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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-03  3:31 ` Lars Ingebrigtsen
  2022-06-03  7:23   ` Thierry EMERY
@ 2022-06-03  7:55   ` Juri Linkov
  1 sibling, 0 replies; 14+ messages in thread
From: Juri Linkov @ 2022-06-03  7:55 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55768, Thierry EMERY

>> isearch fails to highlight in dired and displays the following error:
>> image.png
>
> [...]
>
>>   (while (and (< (point) end) (invisible-p (point)))
>> -  (if (invisible-p (get-text-property (point) 'invisible))
>> +  (if (member (get-text-property (point) 'invisible) buffer-invisibility-spec)
>
> Hm...  shouldn't this just be
>
>> -  (if (invisible-p (point))
>
> ?  The previous change was added by Juri; added to the CCs.

Actually, I just reverted to the previous version.
But the original change was 66e2e71d556785cd10270931c6fc0424b9dea6a6
from bug#8721.





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-03  7:23   ` Thierry EMERY
  2022-06-03  7:42     ` Thierry EMERY
@ 2022-06-04 11:24     ` Lars Ingebrigtsen
  2022-06-28 16:53       ` Juri Linkov
  1 sibling, 1 reply; 14+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-04 11:24 UTC (permalink / raw)
  To: Thierry EMERY; +Cc: 55768, Juri Linkov

Thierry EMERY <thierryalemery@gmail.com> writes:

> (invisible-p (point)) has already been tested in the previous line, but it only tests that
> there is a text property, not actual invisibility:
> (defun invisible-p (pos)
>   (get-text-property pos 'invisible))

That's not the definition of invisible-p.  It's

DEFUN ("invisible-p", Finvisible_p, Sinvisible_p, 1, 1, 0,
       doc: /* Non-nil if text properties at POS cause text there to be currently invisible.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-04 11:24     ` Lars Ingebrigtsen
@ 2022-06-28 16:53       ` Juri Linkov
  2022-06-28 17:22         ` Lars Ingebrigtsen
  0 siblings, 1 reply; 14+ messages in thread
From: Juri Linkov @ 2022-06-28 16:53 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55768, Thierry EMERY

>> (invisible-p (point)) has already been tested in the previous line, but it only tests that
>> there is a text property, not actual invisibility:
>> (defun invisible-p (pos)
>>   (get-text-property pos 'invisible))
>
> That's not the definition of invisible-p.  It's
>
> DEFUN ("invisible-p", Finvisible_p, Sinvisible_p, 1, 1, 0,
>        doc: /* Non-nil if text properties at POS cause text there to be currently invisible.

I checked this again, and I see nothing wrong in the current implementation:

  (invisible-p (get-text-property (point) 'invisible))

is a valid call, because the arg of ‘invisible-p’ can be the actual value
of the ‘invisible’ text property.





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-28 16:53       ` Juri Linkov
@ 2022-06-28 17:22         ` Lars Ingebrigtsen
  2022-06-28 17:37           ` Juri Linkov
  0 siblings, 1 reply; 14+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-28 17:22 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 55768, Thierry EMERY

Juri Linkov <juri@linkov.net> writes:

>>> (invisible-p (point)) has already been tested in the previous line,
>>> but it only tests that
>>> there is a text property, not actual invisibility:
>>> (defun invisible-p (pos)
>>>   (get-text-property pos 'invisible))
>>
>> That's not the definition of invisible-p.  It's
>>
>> DEFUN ("invisible-p", Finvisible_p, Sinvisible_p, 1, 1, 0,
>>        doc: /* Non-nil if text properties at POS cause text there to
>> be currently invisible.
>
> I checked this again, and I see nothing wrong in the current implementation:
>
>   (invisible-p (get-text-property (point) 'invisible))
>
> is a valid call, because the arg of ‘invisible-p’ can be the actual value
> of the ‘invisible’ text property.

The claim was that invisible-p:

>>> it only tests that there is a text property, not actual
>>> invisibility

and then there's a definition of invisible-p, which indeed only tests
that.  I pointed out that that's not what invisible-p is defined as, or
what it does.

In other words, this:

	;; If the following character is currently invisible,
	;; skip all characters with that same `invisible' property value.
	;; Do that over and over.
	(while (and (< (point) end) (invisible-p (point)))
	  (if (invisible-p (get-text-property (point) 'invisible))

Is fine, but

(eq (invisible-p (point))
    (invisible-p (get-text-property (point) 'invisible)))

is always true.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-28 17:22         ` Lars Ingebrigtsen
@ 2022-06-28 17:37           ` Juri Linkov
  2022-06-29  9:56             ` Lars Ingebrigtsen
  0 siblings, 1 reply; 14+ messages in thread
From: Juri Linkov @ 2022-06-28 17:37 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55768, Thierry EMERY

> In other words, this:
>
> 	;; If the following character is currently invisible,
> 	;; skip all characters with that same `invisible' property value.
> 	;; Do that over and over.
> 	(while (and (< (point) end) (invisible-p (point)))
> 	  (if (invisible-p (get-text-property (point) 'invisible))
>
> Is fine, but
>
> (eq (invisible-p (point))
>     (invisible-p (get-text-property (point) 'invisible)))
>
> is always true.

I don't see how it's always true:

1. (invisible-p (point))
   checks invisibility of both: text properties and overlays.

2. (invisible-p (get-text-property (point) 'invisible))
   checks invisibility of text properties only.

3. (invisible-p (overlay-get o 'invisible))
   checks invisibility of overlays only.

There is a need for a separate check because overlays
can be opened, whereas text properties can't.





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-28 17:37           ` Juri Linkov
@ 2022-06-29  9:56             ` Lars Ingebrigtsen
  2022-06-29 17:58               ` Juri Linkov
  0 siblings, 1 reply; 14+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-29  9:56 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 55768, Thierry EMERY

Juri Linkov <juri@linkov.net> writes:

>> 	;; If the following character is currently invisible,
>> 	;; skip all characters with that same `invisible' property value.
>> 	;; Do that over and over.
>> 	(while (and (< (point) end) (invisible-p (point)))
>> 	  (if (invisible-p (get-text-property (point) 'invisible))

[...]

> 1. (invisible-p (point))
>    checks invisibility of both: text properties and overlays.

That's true.  Was that the intention here -- first to check invisibility
of both text properties and overlays and then only check invisibility of
text properties?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-29  9:56             ` Lars Ingebrigtsen
@ 2022-06-29 17:58               ` Juri Linkov
  2022-06-30  9:30                 ` Lars Ingebrigtsen
  0 siblings, 1 reply; 14+ messages in thread
From: Juri Linkov @ 2022-06-29 17:58 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55768, Thierry EMERY

>>> 	;; If the following character is currently invisible,
>>> 	;; skip all characters with that same `invisible' property value.
>>> 	;; Do that over and over.
>>> 	(while (and (< (point) end) (invisible-p (point)))
>>> 	  (if (invisible-p (get-text-property (point) 'invisible))
>
> [...]
>
>> 1. (invisible-p (point))
>>    checks invisibility of both: text properties and overlays.
>
> That's true.  Was that the intention here -- first to check invisibility
> of both text properties and overlays and then only check invisibility of
> text properties?

Yep, that is my understanding too: first check both, then each separately.





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-29 17:58               ` Juri Linkov
@ 2022-06-30  9:30                 ` Lars Ingebrigtsen
  2022-06-30 14:37                   ` Thierry EMERY
  0 siblings, 1 reply; 14+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-30  9:30 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 55768, Thierry EMERY

Juri Linkov <juri@linkov.net> writes:

>> That's true.  Was that the intention here -- first to check invisibility
>> of both text properties and overlays and then only check invisibility of
>> text properties?
>
> Yep, that is my understanding too: first check both, then each separately.

Right.

Anyway, back to the original issue -- Thierry, you reported this problem
for Emacs 26.3, but do you see it in more recent Emacs versions?

If so, can you give a complete recipe to reproduce it, starting from
"emacs -Q"?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-30  9:30                 ` Lars Ingebrigtsen
@ 2022-06-30 14:37                   ` Thierry EMERY
  2022-06-30 14:56                     ` Lars Ingebrigtsen
  0 siblings, 1 reply; 14+ messages in thread
From: Thierry EMERY @ 2022-06-30 14:37 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55768, Juri Linkov

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

Hello,

Good news: the bug that i had in Emacs 26.3 is not present in 28.1.
With Emacs 28.1 compiled from source and started with "src/emacs -Q" i can
use incremental search (e.g. in dired) including for visible text (found)
or invisible text (not found), and highlighting is correct in all cases.
Also i see in Emacs 28.1 sources that `invisible-p' has been rewritten (in
C), and is more thorough than in 26.3 :-)

Thanks,

Thierry


Le jeu. 30 juin 2022 à 11:31, Lars Ingebrigtsen <larsi@gnus.org> a écrit :

> Juri Linkov <juri@linkov.net> writes:
>
> >> That's true.  Was that the intention here -- first to check invisibility
> >> of both text properties and overlays and then only check invisibility of
> >> text properties?
> >
> > Yep, that is my understanding too: first check both, then each
> separately.
>
> Right.
>
> Anyway, back to the original issue -- Thierry, you reported this problem
> for Emacs 26.3, but do you see it in more recent Emacs versions?
>
> If so, can you give a complete recipe to reproduce it, starting from
> "emacs -Q"?
>
> --
> (domestic pets only, the antidote for overdose, milk.)
>    bloggy blog: http://lars.ingebrigtsen.no
>

[-- Attachment #2: Type: text/html, Size: 1746 bytes --]

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

* bug#55768: 26.3; isearch highlighting in dired
  2022-06-30 14:37                   ` Thierry EMERY
@ 2022-06-30 14:56                     ` Lars Ingebrigtsen
  0 siblings, 0 replies; 14+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-30 14:56 UTC (permalink / raw)
  To: Thierry EMERY; +Cc: 55768, Juri Linkov

Thierry EMERY <thierryalemery@gmail.com> writes:

> Good news: the bug that i had in Emacs 26.3 is not present in 28.1.
> With Emacs 28.1 compiled from source and started with "src/emacs -Q" i can use
> incremental search (e.g. in dired) including for visible text (found) or invisible text
> (not found), and highlighting is correct in all cases.

Thanks for checking; I'm closing this bug report, then.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

end of thread, other threads:[~2022-06-30 14:56 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-02 15:22 bug#55768: 26.3; isearch highlighting in dired Thierry EMERY
2022-06-03  3:31 ` Lars Ingebrigtsen
2022-06-03  7:23   ` Thierry EMERY
2022-06-03  7:42     ` Thierry EMERY
2022-06-04 11:24     ` Lars Ingebrigtsen
2022-06-28 16:53       ` Juri Linkov
2022-06-28 17:22         ` Lars Ingebrigtsen
2022-06-28 17:37           ` Juri Linkov
2022-06-29  9:56             ` Lars Ingebrigtsen
2022-06-29 17:58               ` Juri Linkov
2022-06-30  9:30                 ` Lars Ingebrigtsen
2022-06-30 14:37                   ` Thierry EMERY
2022-06-30 14:56                     ` Lars Ingebrigtsen
2022-06-03  7:55   ` Juri Linkov

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