* bug#48317: 27.1; text-property-search-forward moves point to end when not found
@ 2021-05-09 16:41 Howard Melman
2021-05-09 17:07 ` Eli Zaretskii
0 siblings, 1 reply; 19+ messages in thread
From: Howard Melman @ 2021-05-09 16:41 UTC (permalink / raw)
To: 48317
The documentation of function text-property-search-forward says:
If not found, return nil and don’t move point.
Yet I find it moves point to eob.
To reproduce in emacs -Q, with point at beginning of *scratch* buffer with
text in it, eval:
(require 'text-property-search)
(text-property-search-forward 'facet 'foo)
point is moved to end of buffer.
I can reporoduce this in GNUS Emacs 27.1 and the macport of 27.2.
Howard
In GNU Emacs 27.1 (build 1, x86_64-apple-darwin18.7.0, NS appkit-1671.60 Version 10.14.6 (Build 18G95))
of 2020-08-12 built on builder10-14.porkrind.org
Windowing system distributor 'Apple', version 10.3.1894
System Description: Mac OS X 10.15.7
Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Entering debugger...
Back to top level
Entering debugger...
Back to top level
Type C-x 1 to delete the help window, C-M-v to scroll help.
#s(prop-match 54 201 nil)
Mark activated
read--expression: Command attempted to use minibuffer while in minibuffer
Quit
Quit
Configured using:
'configure --with-ns '--enable-locallisppath=/Library/Application
Support/Emacs/${version}/site-lisp:/Library/Application
Support/Emacs/site-lisp' --with-modules'
Configured features:
NOTIFY KQUEUE ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS MODULES
THREADS JSON PDUMPER
Important settings:
value of $LANG: en_US.UTF-8
locale-coding-system: utf-8-unix
Major mode: Lisp Interaction
Minor modes in effect:
tooltip-mode: t
global-eldoc-mode: t
eldoc-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
tool-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
line-number-mode: t
transient-mark-mode: t
Load-path shadows:
None found.
Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
format-spec rfc822 mml mml-sec password-cache epa derived epg epg-config
gnus-util rmail rmail-loaddefs time-date subr-x mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail
rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils cl-extra seq
byte-opt gv bytecomp byte-compile cconv flyspell ispell
text-property-search thingatpt help-fns radix-tree cl-print debug
backtrace help-mode easymenu find-func cl-loaddefs cl-lib tooltip eldoc
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/ns-win
ns-win ucs-normalize mule-util term/common-win tool-bar dnd fontset
image regexp-opt fringe tabulated-list replace newcomment text-mode
elisp-mode lisp-mode prog-mode register page tab-bar menu-bar
rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core term/tty-colors frame minibuffer cl-generic
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote threads kqueue cocoa ns
multi-tty make-network-process emacs)
Memory information:
((conses 16 58535 6154)
(symbols 48 6797 1)
(strings 32 20507 1782)
(string-bytes 1 622865)
(vectors 16 11726)
(vector-slots 8 142380 15728)
(floats 8 34 33)
(intervals 56 320 3)
(buffers 1000 14))
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-09 16:41 bug#48317: 27.1; text-property-search-forward moves point to end when not found Howard Melman
@ 2021-05-09 17:07 ` Eli Zaretskii
[not found] ` <616F7732-ED83-40F0-A460-9298608EAD91@gmail.com>
0 siblings, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-09 17:07 UTC (permalink / raw)
To: Howard Melman; +Cc: 48317
> From: Howard Melman <hmelman@gmail.com>
> Date: Sun, 9 May 2021 12:41:17 -0400
>
>
> The documentation of function text-property-search-forward says:
>
> If not found, return nil and don’t move point.
>
> Yet I find it moves point to eob.
>
> To reproduce in emacs -Q, with point at beginning of *scratch* buffer with
> text in it, eval:
>
> (require 'text-property-search)
> (text-property-search-forward 'facet 'foo)
>
> point is moved to end of buffer.
How do you know it "didn't find" in this case? what was the value it
returned?
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
[not found] ` <616F7732-ED83-40F0-A460-9298608EAD91@gmail.com>
@ 2021-05-09 17:48 ` Eli Zaretskii
[not found] ` <8877DDB9-7D2B-4DCC-8374-EB8391134EAC@gmail.com>
0 siblings, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-09 17:48 UTC (permalink / raw)
To: Howard Melman; +Cc: 48317
[Please use Reply All to keep the bug address on the CC list.]
> From: Howard Melman <hmelman@gmail.com>
> Date: Sun, 9 May 2021 13:28:09 -0400
>
> > On May 9, 2021, at 1:07 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> >
> >> To reproduce in emacs -Q, with point at beginning of *scratch* buffer with
> >> text in it, eval:
> >>
> >> (require 'text-property-search)
> >> (text-property-search-forward 'facet 'foo)
> >>
> >> point is moved to end of buffer.
> >
> > How do you know it "didn't find" in this case? what was the value it
> > returned?
>
> It returned (from *Messages*):
>
> #s(prop-match 75 222 nil)
>
> I tried again with an explicative-laden property name and the value 'foo and it returned:
>
> #s(prop-match 77 224 nil)
>
> If I change 'foo to nil it does not move point.
So in your original use case it _did_ find a match, which is why it
moved point.
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
[not found] ` <8877DDB9-7D2B-4DCC-8374-EB8391134EAC@gmail.com>
@ 2021-05-09 18:33 ` Eli Zaretskii
2021-05-09 19:48 ` Howard Melman
2021-05-10 9:05 ` Lars Ingebrigtsen
0 siblings, 2 replies; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-09 18:33 UTC (permalink / raw)
To: Howard Melman, Lars Ingebrigtsen; +Cc: 48317
[Please use Reply All to keep the bug address on the CC list.]
> From: Howard Melman <hmelman@gmail.com>
> Date: Sun, 9 May 2021 14:10:56 -0400
>
> >> #s(prop-match 77 224 nil)
> >>
> >> If I change 'foo to nil it does not move point.
> >
> > So in your original use case it _did_ find a match, which is why it
> > moved point.
>
> I don't think any region in the buffer has the property 'ffffffff let alone
> with the value 'foo so I don't know what it thinks it's found.
What is the difference between "not having a property" and "having a
property with a nil value"?
> I see in the docstring:
>
> If PREDICATE is nil, a value will match if it is non-nil and
> is NOT equal to VALUE.
>
> But I don't think this applies because no region in the buffer has this property.
I'm trying to establish whether this is a documentation bug or a code
bug. For now, I tend to think it's the former.
> Can you reproduce my simple test case?
> Did it find a region with a random property name?
I don't think I understand the question.
Lars, would you please chime in? Since you coded this stuff, I'm sure
you will be able to explain its workings much better.
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-09 18:33 ` Eli Zaretskii
@ 2021-05-09 19:48 ` Howard Melman
2021-05-10 9:05 ` Lars Ingebrigtsen
1 sibling, 0 replies; 19+ messages in thread
From: Howard Melman @ 2021-05-09 19:48 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Lars Ingebrigtsen, 48317
On May 9, 2021, at 2:33 PM, Eli Zaretskii <eliz@gnu.org> wrote:
>
> [Please use Reply All to keep the bug address on the CC list.]
My apologies.
> What is the difference between "not having a property" and "having a
> property with a nil value"?
I don't think this function should move point in either case.
> I'm trying to establish whether this is a documentation bug or a code
> bug. For now, I tend to think it's the former.
FWIW, I would have appreciated some less oblique confirmation that you could
in fact reproduce my problem, particularly since I explicitly asked if you could and
you declined to answer it.
I think it's the latter. I now see the bug seems to be in the test commented as
"We're standing in the property we're looking for" which is not the case.
My actual use case is trying to find a region with a specific face property.
(text-property-search-forward 'face 'my-package-face)
When there's a region with this face it works great. In the cases where there
is no region with this face property it moves point and I don't see why it should.
Based on my reading of the manual this is the appropriate function for that use,
if not I'd appreciate a pointer to one.
In creating a small reproducible test case it turns out it also moves point when
searching for a non-existing property if passed a value.
Howard
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-09 18:33 ` Eli Zaretskii
2021-05-09 19:48 ` Howard Melman
@ 2021-05-10 9:05 ` Lars Ingebrigtsen
2021-05-10 13:06 ` Howard Melman
1 sibling, 1 reply; 19+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-10 9:05 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Howard Melman, 48317
Eli Zaretskii <eliz@gnu.org> writes:
> Lars, would you please chime in? Since you coded this stuff, I'm sure
> you will be able to explain its workings much better.
I think the doc string is wrong -- you rewrote it in 165890a and further
in df05c26. The original doc string was correct, I think:
+Some convenience values for PREDICATE can also be used. `t'
+means the same as `equal'. `nil' means almost the same as \"not
+equal\", but will also end the match if the value of PROPERTY
+changes. See the manual for extensive examples.
The code performs as originally documented in the test case from Howard,
as far as I can tell.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-10 9:05 ` Lars Ingebrigtsen
@ 2021-05-10 13:06 ` Howard Melman
2021-05-11 12:32 ` Lars Ingebrigtsen
0 siblings, 1 reply; 19+ messages in thread
From: Howard Melman @ 2021-05-10 13:06 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: 48317
On May 10, 2021, at 5:05 AM, Lars Ingebrigtsen <larsi@gnus.org> wrote:
> I think the doc string is wrong -- you rewrote it in 165890a and further
> in df05c26. The original doc string was correct, I think:
>
> +Some convenience values for PREDICATE can also be used. `t'
> +means the same as `equal'. `nil' means almost the same as \"not
> +equal\", but will also end the match if the value of PROPERTY
> +changes. See the manual for extensive examples.
>
> The code performs as originally documented in the test case from Howard,
> as far as I can tell.
Ok, setting property to t solves both of my cases.
What threw me (and I still think is problematic) is this line from the docstring:
If not found, return nil and don't move point.
And this line from the manual:
If the text property can’t be found, the function returns ‘nil’.
Which I assume also infers point is not moved. If no region has the named property I can't see how it can be found and therefore point should not be moved. In fact I don't see how predicate even comes into play in this case.
I still think there's a bug here:
;; We're standing in the property we're looking for, so find the
;; end.
((and (text-property--match-p value (get-text-property (point) property)
predicate)
(not not-current))
(text-property--find-end-forward (point) property value predicate))
Because this solves my problem:
((and (get-text-property (point) property)
(text-property--match-p value (get-text-property (point) property)
predicate)
(not not-current))
(text-property--find-end-forward (point) property value predicate))
Howard
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-10 13:06 ` Howard Melman
@ 2021-05-11 12:32 ` Lars Ingebrigtsen
2021-05-11 12:48 ` Eli Zaretskii
2021-05-11 14:20 ` Howard Melman
0 siblings, 2 replies; 19+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-11 12:32 UTC (permalink / raw)
To: Howard Melman; +Cc: 48317
Howard Melman <hmelman@gmail.com> writes:
> What threw me (and I still think is problematic) is this line from the docstring:
>
> If not found, return nil and don't move point.
>
> And this line from the manual:
>
> If the text property can’t be found, the function returns ‘nil’.
I've now fixed the doc string in Emacs 28.
> Which I assume also infers point is not moved. If no region has the
> named property I can't see how it can be found and therefore point
> should not be moved. In fact I don't see how predicate even comes
> into play in this case.
I'm sorry, I don't follow you. It this still about
(text-property-search-forward 'facet 'foo)
? That works as designed, as far as I can tell. (But not as documented
in the Emacs 27.1 doc string.)
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-11 12:32 ` Lars Ingebrigtsen
@ 2021-05-11 12:48 ` Eli Zaretskii
2021-05-11 13:14 ` Lars Ingebrigtsen
2021-05-11 14:20 ` Howard Melman
1 sibling, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-11 12:48 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: hmelman, 48317
> From: Lars Ingebrigtsen <larsi@gnus.org>
> Cc: Eli Zaretskii <eliz@gnu.org>, 48317@debbugs.gnu.org
> Date: Tue, 11 May 2021 14:32:31 +0200
>
> Howard Melman <hmelman@gmail.com> writes:
>
> > What threw me (and I still think is problematic) is this line from the docstring:
> >
> > If not found, return nil and don't move point.
> >
> > And this line from the manual:
> >
> > If the text property can’t be found, the function returns ‘nil’.
>
> I've now fixed the doc string in Emacs 28.
Did you push that? I don't think I see the change.
Thanks.
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-11 12:48 ` Eli Zaretskii
@ 2021-05-11 13:14 ` Lars Ingebrigtsen
0 siblings, 0 replies; 19+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-11 13:14 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: hmelman, 48317
Eli Zaretskii <eliz@gnu.org> writes:
> Did you push that? I don't think I see the change.
I keep forgetting to push, for some reason... now done.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-11 12:32 ` Lars Ingebrigtsen
2021-05-11 12:48 ` Eli Zaretskii
@ 2021-05-11 14:20 ` Howard Melman
2021-05-11 16:36 ` Lars Ingebrigtsen
1 sibling, 1 reply; 19+ messages in thread
From: Howard Melman @ 2021-05-11 14:20 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: 48317
On May 11, 2021, at 8:32 AM, Lars Ingebrigtsen <larsi@gnus.org> wrote:
>
>> If no region has the named property I can't see how it can be found
>> and therefore point should not be moved. In fact I don't see how predicate
>> even comes into play in this case.
>
> I'm sorry, I don't follow you. It this still about
>
> (text-property-search-forward 'facet 'foo)
>
> ? That works as designed, as far as I can tell. (But not as documented
> in the Emacs 27.1 doc string.)
Yes, Note that says "facet" and not "face"
To be more clear, I find when calling:
(text-property-search-forward 'unused-property 'my-package-face)
when no text in the buffer has the property unused-property, that
calling text-property-search-forward moves point to eob.
Is this intended behavior? If so I don't understand why.
If I set the predicate to t point is not moved which is what I want,
but I don't see why that should be the case. Does Emacs check for
properties with equal?
I think the bug is in the test commented as "We're standing in the
property we're looking for, so find the end" because the test is
matched because
(get-text-property (point) property)
returns nil and text-property--match-p is called with
(my-package-face nil nil)
and returns non-nil. I don't think this test should match
because point is not in the property unused-property.
Howard
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-11 14:20 ` Howard Melman
@ 2021-05-11 16:36 ` Lars Ingebrigtsen
2021-05-11 19:28 ` Howard Melman
0 siblings, 1 reply; 19+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-11 16:36 UTC (permalink / raw)
To: Howard Melman; +Cc: 48317
Howard Melman <hmelman@gmail.com> writes:
>> I'm sorry, I don't follow you. It this still about
>>
>> (text-property-search-forward 'facet 'foo)
>>
>> ? That works as designed, as far as I can tell. (But not as documented
>> in the Emacs 27.1 doc string.)
>
> Yes, Note that says "facet" and not "face"
Yes, that the text property you're looking for is called `facet'?
> To be more clear, I find when calling:
>
> (text-property-search-forward 'unused-property 'my-package-face)
>
> when no text in the buffer has the property unused-property, that
> calling text-property-search-forward moves point to eob.
>
> Is this intended behavior? If so I don't understand why.
I'm not sure I understand what you're not understanding. :-) You're
using nil as the PREDICATE here (a missing parameter is nil), which
means that you're searching for areas in the buffer where the text
property `facet' is not equal to `foo'. Which is the rest of the
buffer.
If you're looking for a portion of the buffer where `unused-property' is
`my-package-face', then you should say:
(text-property-search-forward 'unused-property 'my-package-face t)
or
(text-property-search-forward 'unused-property 'my-package-face #'eq)
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-11 16:36 ` Lars Ingebrigtsen
@ 2021-05-11 19:28 ` Howard Melman
2021-05-11 23:18 ` Stephen Berman
2021-05-12 14:16 ` Lars Ingebrigtsen
0 siblings, 2 replies; 19+ messages in thread
From: Howard Melman @ 2021-05-11 19:28 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: 48317
On May 11, 2021, at 12:36 PM, Lars Ingebrigtsen <larsi@gnus.org> wrote:
>
> Howard Melman <hmelman@gmail.com> writes:
>
>>> I'm sorry, I don't follow you. It this still about
>>>
>>> (text-property-search-forward 'facet 'foo)
>>>
>>> ? That works as designed, as far as I can tell. (But not as documented
>>> in the Emacs 27.1 doc string.)
>>
>> Yes, Note that says "facet" and not "face"
>
> Yes, that the text property you're looking for is called `facet'?
>
>> To be more clear, I find when calling:
>>
>> (text-property-search-forward 'unused-property 'my-package-face)
>>
>> when no text in the buffer has the property unused-property, that
>> calling text-property-search-forward moves point to eob.
>>
>> Is this intended behavior? If so I don't understand why.
>
> I'm not sure I understand what you're not understanding. :-)
I have felt the same way :) Thanks for your patience.
> You're using nil as the PREDICATE here (a missing parameter is nil), which
> means that you're searching for areas in the buffer where the text
> property `facet' is not equal to `foo'. Which is the rest of the buffer.
Thank you for explaining the logic and not just saying "working as designed".
"Which is the rest of the buffer." is what clicked for me.
I was reading "text-property-search-forward" as "look forward to find
a text property PROPERTY with value VALUE." There wasn't one, so the
search should should fail and not move point.
To me, this function behaves unexpectedly different in these cases
(say in a font-locked elisp buffer just before the last defun):
;; a region with property face is found,
;; point is moved to the end of it
(text-property-search-forward 'face)
;; a region with property unused is not found,
;; point is unmoved
(text-property-search-forward 'unused)
;; a region with the specfied face is found,
;; point is moved to the beginning of it
(text-property-search-forward 'face 'font-lock-function-name-face)
;; a region with the specfied face is not found,
;; point is moved to eob
(text-property-search-forward 'face 'unused)
;; a region with the specfied property is not found,
;; point is moved to eob
(text-property-search-forward 'unused-prop 'unused-value)
The first two behave perfectly reasonably to me. And as the manual
suggests, behaves the same as search-forward.
The 3rd does as well, of course.
I'd expect both the 4th and the 5th to behave the same as the 2nd but
they move point to eob.
And while I now mostly understand (but don't fully grok) the logic,
it's baffling to me that to make the last three behave like the first
two I should set PREDICATE to t (and btw doing so changes the behavior
of the 3rd to leave point at the end of the match instead of the
beginning, which seems odd).
The difference between the 3rd and 4th isn't some subtle difference
between using equal and eq or something, it's that the specified value
of the face is not found as it was using the default predicate in the
3rd case. And particularly in the 5th, the choice of predicate to
evaluate 'unused-value shouldn't come into play because 'unused-prop
itself isn't found.
And the documentation describing PREDICATE nil didn't help me at all.
In the manual it says for nil:
(which means “not equal”)
which sounds to me as if it is using the function not.
And in your updated docstring as:
a value will match if is not `equal' to VALUE
which really throws me because the 3rd case above works and it's
not "not `equal'" to font-lock-function-name-face!
Does this explain my confusion?
I interpret all of these:
(search-forward "defun")
(text-property-search-forward 'face)
(text-property-search-forward 'face 'font-lock-function-name-face)
to mean search for the thing I specified, whether that's a string, a
specific property with any value or a specific property with a
specific value. But somehow the last one is different. And try as I
might now to write how it's being interpreted I'm unable to. Search
for the property face but only if it is font-lock-function-name-face
or if it isn't...?
Howard
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-11 19:28 ` Howard Melman
@ 2021-05-11 23:18 ` Stephen Berman
2021-05-12 14:16 ` Lars Ingebrigtsen
1 sibling, 0 replies; 19+ messages in thread
From: Stephen Berman @ 2021-05-11 23:18 UTC (permalink / raw)
To: Howard Melman; +Cc: Lars Ingebrigtsen, 48317
On Tue, 11 May 2021 15:28:48 -0400 Howard Melman <hmelman@gmail.com> wrote:
> To me, this function behaves unexpectedly different in these cases
> (say in a font-locked elisp buffer just before the last defun):
>
> ;; a region with property face is found,
> ;; point is moved to the end of it
> (text-property-search-forward 'face)
>
> ;; a region with property unused is not found,
> ;; point is unmoved
> (text-property-search-forward 'unused)
>
> ;; a region with the specfied face is found,
> ;; point is moved to the beginning of it
> (text-property-search-forward 'face 'font-lock-function-name-face)
>
> ;; a region with the specfied face is not found,
> ;; point is moved to eob
> (text-property-search-forward 'face 'unused)
>
> ;; a region with the specfied property is not found,
> ;; point is moved to eob
> (text-property-search-forward 'unused-prop 'unused-value)
>
> The first two behave perfectly reasonably to me. And as the manual
> suggests, behaves the same as search-forward.
>
> The 3rd does as well, of course.
>
> I'd expect both the 4th and the 5th to behave the same as the 2nd but
> they move point to eob.
>
> And while I now mostly understand (but don't fully grok) the logic,
> it's baffling to me that to make the last three behave like the first
> two I should set PREDICATE to t (and btw doing so changes the behavior
> of the 3rd to leave point at the end of the match instead of the
> beginning, which seems odd).
It's behaving as documented: without t, the search found some other
value of 'face (possibly nil) not equal to 'font-lock-function-name-face
and moved to the end of the thus propertized text, as documented. You
should see this in the return value (shown as a message), which could be
something like this: #s(prop-match 37 41 nil)
> The difference between the 3rd and 4th isn't some subtle difference
> between using equal and eq or something, it's that the specified value
> of the face is not found as it was using the default predicate in the
> 3rd case.
No, in the third case the search stopped before the specified value was
found.
> And particularly in the 5th, the choice of predicate to
> evaluate 'unused-value shouldn't come into play because 'unused-prop
> itself isn't found.
>
> And the documentation describing PREDICATE nil didn't help me at all.
> In the manual it says for nil:
>
> (which means “not equal”)
>
> which sounds to me as if it is using the function not.
>
> And in your updated docstring as:
>
> a value will match if is not `equal' to VALUE
>
> which really throws me because the 3rd case above works and it's
> not "not `equal'" to font-lock-function-name-face!
Again, this is correct: the found value (possibly nil, as illustrated
above) is not equal to 'font-lock-function-name-face.
> Does this explain my confusion?
>
> I interpret all of these:
>
> (search-forward "defun")
> (text-property-search-forward 'face)
> (text-property-search-forward 'face 'font-lock-function-name-face)
>
> to mean search for the thing I specified, whether that's a string, a
> specific property with any value or a specific property with a
> specific value. But somehow the last one is different. And try as I
> might now to write how it's being interpreted I'm unable to. Search
> for the property face but only if it is font-lock-function-name-face
> or if it isn't...?
In light of the above explanations, is it clearer now?
Steve Berman
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-11 19:28 ` Howard Melman
2021-05-11 23:18 ` Stephen Berman
@ 2021-05-12 14:16 ` Lars Ingebrigtsen
2021-05-12 16:29 ` Howard Melman
1 sibling, 1 reply; 19+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-12 14:16 UTC (permalink / raw)
To: Howard Melman; +Cc: 48317
Howard Melman <hmelman@gmail.com> writes:
> To me, this function behaves unexpectedly different in these cases
> (say in a font-locked elisp buffer just before the last defun):
>
> ;; a region with property face is found,
> ;; point is moved to the end of it
> (text-property-search-forward 'face)
The doc string in Emacs 27 is misleading, because it doesn't emphasise
the meaning of PREDICATE.
What the form above does is look for areas where there's a text property
named `face' that uses the nil predicate on a nil value. :-)
That is, it finds all areas where the `face' property is not nil --
VALUE is nil, and PREDICATE is nil.
> ;; a region with the specfied face is found,
> ;; point is moved to the beginning of it
> (text-property-search-forward 'face 'font-lock-function-name-face)
No, here you're looking for regions where `face' is not
`font-lock-function-name-face' -- which will indeed leave you at the
start of the region where `face' is `font-lock-function-name-face', but
that's not really what the function matched.
But I understand your confusion now. The function searches for areas
where a text property is matching something (according to PREDICATE),
and leaves point at the end of the match. You, instead, expect it to
leave point at the start of the match, which is the opposite of what it
does.
Hm... Oh! That's wrong in the doc string, too -- it says that it moves
point to the start of the region, which it certainly doesn't. I've now
fixed this in the two doc strings.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-12 14:16 ` Lars Ingebrigtsen
@ 2021-05-12 16:29 ` Howard Melman
2021-05-12 16:55 ` Lars Ingebrigtsen
0 siblings, 1 reply; 19+ messages in thread
From: Howard Melman @ 2021-05-12 16:29 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: 48317
On May 12, 2021, at 10:16 AM, Lars Ingebrigtsen <larsi@gnus.org> wrote:
> Howard Melman <hmelman@gmail.com> writes:
>
>> ;; a region with the specfied face is found,
>> ;; point is moved to the beginning of it
>> (text-property-search-forward 'face 'font-lock-function-name-face)
>>
> No, here you're looking for regions where `face' is not
> `font-lock-function-name-face' -- which will indeed leave you at the
> start of the region where `face' is `font-lock-function-name-face', but
> that's not really what the function matched.
I have read the above a dozen times and still am not sure I follow
it. AIUI since predicate is nil this is looking for regions where face
is not font-lock-function-name-face. But how does that leave you at
the start of a region where face is indeed
font-lock-function-name-face?
Is what it's doing leaving you at the end of a region where face isn't
font-lock-function-name-face? (Which thanks to Stephen Berman I
realize that the function leaving you at the beginning or end of a
match was very significant to understanding what was happening). If
so I think that is not at all intuitive from reading the above line of
code.
> But I understand your confusion now.
Thank you, I thought I was going crazy.
> The function searches for areas where a text property is matching
> something (according to PREDICATE), and leaves point at the end of the
> match. You, instead, expect it to leave point at the start of the
> match, which is the opposite of what it does.
I want to be more explicit here. I do expect it to search for areas
where a text property is matching something. It of course is
dependent on the value of all of its arguments including PREDICATE,
though I'd expect the default value of PREDICATE to DTRT in the common
case. I know that common can be misunderstood but for a search
function I thought I was on strong ground that "find the thing I
specify" is the common case. I don't much care whether this function
leaves you at the start or end of the match, I'd expect to find out
that specific detail from the docstring or observed behavior. And
usually if I'm lucky I find in the docstring, manual or code some
convenient idiom like your while loop example that makes this choice
very convenient in actual use.
AIUI, all of this confusion is because "leaves you at the end of a not
matching area" and "leaves you at the beginning of a matching area"
happen to be the same place if such an area exists, but is quite
different if it doesn't.
Or could have been avoided if the function was named
goto-end-of-region-not-matching-text-property
which I *think* is an accurate (though horrible) name?
> Hm... Oh! That's wrong in the doc string, too -- it says that it moves
> point to the start of the region, which it certainly doesn't. I've now
> fixed this in the two doc strings.
It's probably impossible to change in the signature because of
compatibility but perhaps this could inform the docstring. AIUI if
this function is not passed a VALUE or PREDICATE it searches for
regions that contain PROPERTY (a "trick" because a property having a
nil value is the same as not being present). But with just a VALUE it
searches for areas that don't have the PROPERTY/VALUE combo because
PREDICATE is nil. And if PREDICATE is t it searches for areas that do
have that combo.
Since in lisp a default optional argument is nil, I think the behavior
with the default value of PREDICATE is reversed from what it should be
for a function named "search". Particularly since it changes the sense
of the function from when just PROPERTY is passed as opposed to when
PROPERTY and VALUE are passed (right?).
Your example of using this function with a while loop definitely helps
reveal its intended use. Perhaps including one when passing VALUE to
the function would help?
I will happily commented on a proposed docstring if you post it here.
I've not signed papers but do I have to for docstring contributions?
Thanks.
Howard
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2021-05-12 16:29 ` Howard Melman
@ 2021-05-12 16:55 ` Lars Ingebrigtsen
[not found] ` <5AA9C2CD-D20B-4B9D-83D6-9002E9396558@gmail.com>
0 siblings, 1 reply; 19+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-12 16:55 UTC (permalink / raw)
To: Howard Melman; +Cc: 48317
Howard Melman <hmelman@gmail.com> writes:
> It's probably impossible to change in the signature because of
> compatibility but perhaps this could inform the docstring. AIUI if
> this function is not passed a VALUE or PREDICATE it searches for
> regions that contain PROPERTY (a "trick" because a property having a
> nil value is the same as not being present). But with just a VALUE it
> searches for areas that don't have the PROPERTY/VALUE combo because
> PREDICATE is nil. And if PREDICATE is t it searches for areas that do
> have that combo.
I think you've gotten how the function works now. :-)
Except that the nil PREDICATE isn't exactly the same as "not equal" --
in that case, all regions with the same value (that doesn't match) would
be one single match, but the nil PREDICATE also stops when the value
changes.
> Since in lisp a default optional argument is nil, I think the behavior
> with the default value of PREDICATE is reversed from what it should be
> for a function named "search". Particularly since it changes the sense
> of the function from when just PROPERTY is passed as opposed to when
> PROPERTY and VALUE are passed (right?).
The one parameter version is intuitive, while the two parameter version
isn't -- that's true. And this certainly wasn't helped by the doc
string stating the opposite of how this function worked. :-)
> Your example of using this function with a while loop definitely helps
> reveal its intended use. Perhaps including one when passing VALUE to
> the function would help?
I think that's for the manual, which has copious examples and explains
all the bits. (And has, as far as I can tell, not been corrected to be
wrong while I wasn't looking. :-))
> I will happily commented on a proposed docstring if you post it here.
> I've not signed papers but do I have to for docstring contributions?
No, that's not necessary -- but is there anything that needs to be
clarified further?
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
[not found] ` <5AA9C2CD-D20B-4B9D-83D6-9002E9396558@gmail.com>
@ 2022-05-13 18:32 ` Howard Melman
2022-05-14 2:19 ` Lars Ingebrigtsen
0 siblings, 1 reply; 19+ messages in thread
From: Howard Melman @ 2022-05-13 18:32 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: 48317
On May 12, 2021, at 1:03 PM, Howard Melman <hmelman@gmail.com> wrote:
>
> On May 12, 2021, at 12:55 PM, Lars Ingebrigtsen <larsi@gnus.org> wrote:
>>
>>> I will happily commented on a proposed docstring if you post it here.
>>> I've not signed papers but do I have to for docstring contributions?
>>
>> No, that's not necessary -- but is there anything that needs to be
>> clarified further?
>
> Just, do I need to sign papers for docstring contributions?
> I have that question for an unrelated issue.
>
> Otherwise feel free to close this bug.
FYI, I believe this bug is still open and can be closed.
Howard
^ permalink raw reply [flat|nested] 19+ messages in thread
* bug#48317: 27.1; text-property-search-forward moves point to end when not found
2022-05-13 18:32 ` Howard Melman
@ 2022-05-14 2:19 ` Lars Ingebrigtsen
0 siblings, 0 replies; 19+ messages in thread
From: Lars Ingebrigtsen @ 2022-05-14 2:19 UTC (permalink / raw)
To: Howard Melman; +Cc: 48317
Howard Melman <hmelman@gmail.com> writes:
> FYI, I believe this bug is still open and can be closed.
Yup; I've now closed it.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2022-05-14 2:19 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-05-09 16:41 bug#48317: 27.1; text-property-search-forward moves point to end when not found Howard Melman
2021-05-09 17:07 ` Eli Zaretskii
[not found] ` <616F7732-ED83-40F0-A460-9298608EAD91@gmail.com>
2021-05-09 17:48 ` Eli Zaretskii
[not found] ` <8877DDB9-7D2B-4DCC-8374-EB8391134EAC@gmail.com>
2021-05-09 18:33 ` Eli Zaretskii
2021-05-09 19:48 ` Howard Melman
2021-05-10 9:05 ` Lars Ingebrigtsen
2021-05-10 13:06 ` Howard Melman
2021-05-11 12:32 ` Lars Ingebrigtsen
2021-05-11 12:48 ` Eli Zaretskii
2021-05-11 13:14 ` Lars Ingebrigtsen
2021-05-11 14:20 ` Howard Melman
2021-05-11 16:36 ` Lars Ingebrigtsen
2021-05-11 19:28 ` Howard Melman
2021-05-11 23:18 ` Stephen Berman
2021-05-12 14:16 ` Lars Ingebrigtsen
2021-05-12 16:29 ` Howard Melman
2021-05-12 16:55 ` Lars Ingebrigtsen
[not found] ` <5AA9C2CD-D20B-4B9D-83D6-9002E9396558@gmail.com>
2022-05-13 18:32 ` Howard Melman
2022-05-14 2:19 ` Lars Ingebrigtsen
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).