unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#24969: 26.0.50; number-at-point
@ 2016-11-20 12:47 Andreas Röhler
  2016-11-20 12:53 ` Stephen Berman
  2021-08-10 16:18 ` Lars Ingebrigtsen
  0 siblings, 2 replies; 15+ messages in thread
From: Andreas Röhler @ 2016-11-20 12:47 UTC (permalink / raw)
  To: 24969

After evaluating show-number in buffer of contents below, it should jump 
to char "1" and return them, but returns nil.

;;;

foo-1

(defun show-number ()
   (interactive)
   (goto-char 5)
   (message "%s" (number-at-point)))

;;;


In GNU Emacs 26.0.50.1 (i686-pc-linux-gnu, GTK+ Version 3.14.5) of 
2016-11-15








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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 12:47 bug#24969: 26.0.50; number-at-point Andreas Röhler
@ 2016-11-20 12:53 ` Stephen Berman
  2016-11-20 13:53   ` Andreas Röhler
  2021-08-10 16:18 ` Lars Ingebrigtsen
  1 sibling, 1 reply; 15+ messages in thread
From: Stephen Berman @ 2016-11-20 12:53 UTC (permalink / raw)
  To: Andreas Röhler; +Cc: 24969

On Sun, 20 Nov 2016 13:47:50 +0100 Andreas Röhler <andreas.roehler@easy-emacs.de> wrote:

> After evaluating show-number in buffer of contents below, it should jump to
> char "1" and return them, but returns nil.
>
> ;;;
>
> foo-1
>
> (defun show-number ()
>   (interactive)
>   (goto-char 5)
>   (message "%s" (number-at-point)))
>
> ;;;

When I try your recipe, point jumps to the - sign and the echo area
displays -1.

> In GNU Emacs 26.0.50.1 (i686-pc-linux-gnu, GTK+ Version 3.14.5) of 2016-11-15

I'm using
GNU Emacs 26.0.50.17 (x86_64-suse-linux-gnu, GTK+ Version 3.14.15)
 of 2016-11-18
(built from commit 0d913da15c094bf596dd685acecf3438228c15cf from master)

Steve Berman





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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 12:53 ` Stephen Berman
@ 2016-11-20 13:53   ` Andreas Röhler
  2016-11-20 14:15     ` npostavs
  0 siblings, 1 reply; 15+ messages in thread
From: Andreas Röhler @ 2016-11-20 13:53 UTC (permalink / raw)
  To: Stephen Berman; +Cc: 24969



On 20.11.2016 13:53, Stephen Berman wrote:
> On Sun, 20 Nov 2016 13:47:50 +0100 Andreas Röhler <andreas.roehler@easy-emacs.de> wrote:
>
>> After evaluating show-number in buffer of contents below, it should jump to
>> char "1" and return them, but returns nil.
>>
>> ;;;
>>
>> foo-1
>>
>> (defun show-number ()
>>    (interactive)
>>    (goto-char 5)
>>    (message "%s" (number-at-point)))
>>
>> ;;;
> When I try your recipe, point jumps to the - sign
Seems there is a leading whitespace.


>   and the echo area
> displays -1.

Here with that start from minus-sign equally nil is returned.

Thanks






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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 13:53   ` Andreas Röhler
@ 2016-11-20 14:15     ` npostavs
  2016-11-20 16:19       ` Drew Adams
  0 siblings, 1 reply; 15+ messages in thread
From: npostavs @ 2016-11-20 14:15 UTC (permalink / raw)
  To: Andreas Röhler; +Cc: Stephen Berman, 24969

tags 24969 unreproducible
quit

Andreas Röhler <andreas.roehler@easy-emacs.de> writes:

> On 20.11.2016 13:53, Stephen Berman wrote:
>> On Sun, 20 Nov 2016 13:47:50 +0100 Andreas Röhler <andreas.roehler@easy-emacs.de> wrote:
>>
>>> After evaluating show-number in buffer of contents below, it should jump to
>>> char "1" and return them, but returns nil.
>>>
>>> ;;;
>>>
>>> foo-1
>>>
>>> (defun show-number ()
>>>    (interactive)
>>>    (goto-char 5)
>>>    (message "%s" (number-at-point)))
>>>
>>> ;;;
>> When I try your recipe, point jumps to the - sign
> Seems there is a leading whitespace.
>
>
>>   and the echo area
>> displays -1.
>
> Here with that start from minus-sign equally nil is returned.
>
> Thanks

I get -1 here too.

GNU Emacs 26.0.50.15 (x86_64-unknown-linux-gnu, X toolkit) of 2016-11-19





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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 14:15     ` npostavs
@ 2016-11-20 16:19       ` Drew Adams
  2016-11-20 16:35         ` Noam Postavsky
  2016-11-21 13:09         ` Tino Calancha
  0 siblings, 2 replies; 15+ messages in thread
From: Drew Adams @ 2016-11-20 16:19 UTC (permalink / raw)
  To: npostavs, Andreas Röhler; +Cc: Stephen Berman, 24969

> tags 24969 unreproducible
> quit

Dunno what this is all about, why some of you are seeing
a number returned (or printed in a message), or why any
of you would expect that to be the case.

In Emacs 25.1 (emacs -Q), `number-at-point' at either
the `-' or the `1' returns nil, for me.  And I do not
see why it should return a number.

`number-at-point' is defined using `form-at-point' with
THING `sexp' and predicate `numberp'.  The sexp picked
up at point is `foo-1', and that fails `numberp'.

What am I missing?  Why should this rightfully return
a number?  I'm guessing that you are all using a more
recent version of `number-at-point' than what is in
Emacs 25.1 (?).  But to me the Emacs 25.1 behavior I
see (i.e., returning nil) is correct.

Did someone change the meaning of `number-at-point'
so that it now picks up a numeral that is not isolated?
If so, why would that be considered proper behavior?
At the very least it is not backward-compatible behavior.

(Hoping I'm just misunderstanding something here.)





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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 16:19       ` Drew Adams
@ 2016-11-20 16:35         ` Noam Postavsky
  2016-11-20 16:58           ` Drew Adams
  2016-11-21 13:09         ` Tino Calancha
  1 sibling, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-11-20 16:35 UTC (permalink / raw)
  To: Drew Adams; +Cc: Stephen Berman, 24969

On Sun, Nov 20, 2016 at 11:19 AM, Drew Adams <drew.adams@oracle.com> wrote:
>
> In Emacs 25.1 (emacs -Q), `number-at-point' at either
> the `-' or the `1' returns nil, for me.  And I do not
> see why it should return a number.

With 25.1 I get nil, on 26.0.50 I'm getting -1. I believe this is due
to the fix in https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24605





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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 16:35         ` Noam Postavsky
@ 2016-11-20 16:58           ` Drew Adams
  2016-11-20 19:26             ` Andreas Röhler
  0 siblings, 1 reply; 15+ messages in thread
From: Drew Adams @ 2016-11-20 16:58 UTC (permalink / raw)
  To: Noam Postavsky; +Cc: Stephen Berman, 24969

> > In Emacs 25.1 (emacs -Q), `number-at-point' at either
> > the `-' or the `1' returns nil, for me.  And I do not
> > see why it should return a number.
> 
> With 25.1 I get nil, on 26.0.50 I'm getting -1. I believe this is
> due to the fix in https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24605

I see.  Dunno what I think about this.  I'd be interested to
hear more from Tino about this.  It clearly is not backward
compatible.  Whether it is an improvement or not, I'm not
sure, in this case.

I guess it depends on what a user would expect of a
"number-at-point" function.  A priori, I don't see why s?he
would expect a non-nil answer if the numeral is embedded in
text that does not delimit a numeral (e.g. non whitespace text).
But maybe it is OK.

Would we expect the same kind of behavior for `sexp-at-point'
if a sexp were not surrounded by chars that delimit a sexp?

In Lisp, at least, there is no number at point, in `foo-2'.
That is, the Lisp parser (reader) would never pick up the
`2' as a number here.

I'm partial to use of thingatpt for Lisp, but I realize that
it is used in other contexts too.  I would probably prefer
that, whatever the context, if the context has a notion of
number and its syntax (numerals) then `number-at-point'
would return a number ONLY when there is really a number
at point, based on the meaning of numeral in that context.

If we could do that well, that would be best, I think.  In
the case of Lisp, it is clear (to me) that returning a number
for `foo-2', with point on the `2', is wrong.

I think we need to think more about this.  One option is
to provide two different functions, one of which does what
has been done in the past and one of which tries to be
smarter along the lines of fixing this bug (but not
necessarily along the lines of the implemented fix).

IOW, I agree with the bug report that `form-at-point'
should - somehow - handle the case where `thing-at-point'
returns a non-string.  There is a bug to be fixed.  But
I'm not convinced that the fix we've implemented is TRT.

I'm open to being convinced otherwise, but this does not
seeme right to me, so far.  It seems like we should be able
to do better, here.





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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 16:58           ` Drew Adams
@ 2016-11-20 19:26             ` Andreas Röhler
  2016-11-20 21:28               ` Drew Adams
  0 siblings, 1 reply; 15+ messages in thread
From: Andreas Röhler @ 2016-11-20 19:26 UTC (permalink / raw)
  To: Drew Adams, Noam Postavsky; +Cc: Stephen Berman, 24969



On 20.11.2016 17:58, Drew Adams wrote:
>>> In Emacs 25.1 (emacs -Q), `number-at-point' at either
>>> the `-' or the `1' returns nil, for me.  And I do not
>>> see why it should return a number.
>> With 25.1 I get nil, on 26.0.50 I'm getting -1. I believe this is
>> due to the fix in https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24605
> I see.  Dunno what I think about this.  I'd be interested to
> hear more from Tino about this.  It clearly is not backward
> compatible.  Whether it is an improvement or not, I'm not
> sure, in this case.
>
> I guess it depends on what a user would expect of a
> "number-at-point" function.  A priori, I don't see why s?he
> would expect a non-nil answer if the numeral is embedded in
> text that does not delimit a numeral (e.g. non whitespace text).
> But maybe it is OK.
>
> Would we expect the same kind of behavior for `sexp-at-point'
> if a sexp were not surrounded by chars that delimit a sexp?
>
> In Lisp, at least, there is no number at point, in `foo-2'.
> That is, the Lisp parser (reader) would never pick up the
> `2' as a number here.
>
> I'm partial to use of thingatpt for Lisp, but I realize that
> it is used in other contexts too.

In use here for edit-purposes.
For example raise all numbers in a region - makes it easier sometimes to 
adapt stuff, which doesn't deserve an own template.

Have a first implementation with ar-add-numbers in 
https://github.com/andreas-roehler/werkstatt/blob/master/misc/misc-utils.el 
- just re-writing it.










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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 19:26             ` Andreas Röhler
@ 2016-11-20 21:28               ` Drew Adams
  2016-11-21  6:48                 ` Andreas Röhler
  0 siblings, 1 reply; 15+ messages in thread
From: Drew Adams @ 2016-11-20 21:28 UTC (permalink / raw)
  To: Andreas Röhler, Noam Postavsky; +Cc: Stephen Berman, 24969

> > I guess it depends on what a user would expect of a
> > "number-at-point" function.  A priori, I don't see why s?he
> > would expect a non-nil answer if the numeral is embedded in
> > text that does not delimit a numeral (e.g. non whitespace text).
> > But maybe it is OK.
> >
> > Would we expect the same kind of behavior for `sexp-at-point'
> > if a sexp were not surrounded by chars that delimit a sexp?
> >
> > In Lisp, at least, there is no number at point, in `foo-2'.
> > That is, the Lisp parser (reader) would never pick up the
> > `2' as a number here.
> >
> > I'm partial to use of thingatpt for Lisp, but I realize that
> > it is used in other contexts too.
> 
> In use here for edit-purposes.  For example raise all numbers
> in a region - makes it easier sometimes to adapt stuff, which
> doesn't deserve an own template.

But the question is, "What constitutes a numeral?" in the given
context.  Whatever the context, I would expect some kind of
well-defined delimiting.  In Lisp I would expect what the Lisp
reader would pick up as a number - nothing more.  And that would
exclude picking up `2' within `foo-2'.

> Have a first implementation with ar-add-numbers in
> https://github.com/andreas-roehler/werkstatt/blob/master/misc/misc-
> utils.el - just re-writing it.

There is no `ar-add-numbers' or `add-numbers' in that file
(having downloaded it just now).  Perhaps you meant
`ar-add-to-number-cummulative'?  That is undefined, without
`ar-bounds-of-number-atpt' (not in the file).

Anyway, my point was made above.





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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 21:28               ` Drew Adams
@ 2016-11-21  6:48                 ` Andreas Röhler
  2016-11-21 14:22                   ` Drew Adams
  0 siblings, 1 reply; 15+ messages in thread
From: Andreas Röhler @ 2016-11-21  6:48 UTC (permalink / raw)
  To: Drew Adams, Noam Postavsky; +Cc: Stephen Berman, 24969



On 20.11.2016 22:28, Drew Adams wrote:
>>> I guess it depends on what a user would expect of a
>>> "number-at-point" function.  A priori, I don't see why s?he
>>> would expect a non-nil answer if the numeral is embedded in
>>> text that does not delimit a numeral (e.g. non whitespace text).
>>> But maybe it is OK.
>>>
>>> Would we expect the same kind of behavior for `sexp-at-point'
>>> if a sexp were not surrounded by chars that delimit a sexp?
>>>
>>> In Lisp, at least, there is no number at point, in `foo-2'.
>>> That is, the Lisp parser (reader) would never pick up the
>>> `2' as a number here.
>>>
>>> I'm partial to use of thingatpt for Lisp, but I realize that
>>> it is used in other contexts too.
>> In use here for edit-purposes.  For example raise all numbers
>> in a region - makes it easier sometimes to adapt stuff, which
>> doesn't deserve an own template.
> But the question is, "What constitutes a numeral?" in the given
> context.  Whatever the context, I would expect some kind of
> well-defined delimiting.  In Lisp I would expect what the Lisp
> reader would pick up as a number - nothing more.


The perspective of the lisp-programmer and the user of an editor may be 
different here.
The implementation at progress should pick any valid hex- octal- or 
decimal integer at point.

In a related case even characters are raised here, returning a "b" for 
an "a", an "y" for an "x" etc.
Thus smart-inserting a second (loop)-variable given there exist already 
a first one.


>    And that would
> exclude picking up `2' within `foo-2'.

Not, when for example filenames inside shell-scripts etc. are edited.


>
>> Have a first implementation with ar-add-numbers in
>> https://github.com/andreas-roehler/werkstatt/blob/master/misc/misc-
>> utils.el - just re-writing it.
> There is no `ar-add-numbers' or `add-numbers' in that file
> (having downloaded it just now).  Perhaps you meant
> `ar-add-to-number-cummulative'?  That is undefined, without
> `ar-bounds-of-number-atpt' (not in the file).

Errrm, ar-add-to-number should DTRT, sorry.






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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 16:19       ` Drew Adams
  2016-11-20 16:35         ` Noam Postavsky
@ 2016-11-21 13:09         ` Tino Calancha
  2016-11-21 23:07           ` Drew Adams
  1 sibling, 1 reply; 15+ messages in thread
From: Tino Calancha @ 2016-11-21 13:09 UTC (permalink / raw)
  To: Drew Adams; +Cc: Stephen Berman, tino.calancha, 24969, npostavs

Drew Adams <drew.adams@oracle.com> writes:

> In Emacs 25.1 (emacs -Q), `number-at-point' at either
> the `-' or the `1' returns nil, for me.  And I do not
> see why it should return a number.
>
> `number-at-point' is defined using `form-at-point' with
> THING `sexp' and predicate `numberp'.  The sexp picked
> up at point is `foo-1', and that fails `numberp'.
From the time when i opened Bug#24605, the 
implementation, in master branch, of `number-at-point'
was different: it changed in commit 786ab4a5 (Bug#8634).
My patch was driven by this implementation.  I didn't notice
that `number-at-point' behaves different in emacs-25.

> What am I missing?  Why should this rightfully return
> a number?  I'm guessing that you are all using a more
> recent version of `number-at-point' than what is in
> Emacs 25.1 (?).  But to me the Emacs 25.1 behavior I
> see (i.e., returning nil) is correct.
>
> Did someone change the meaning of `number-at-point'
> so that it now picks up a numeral that is not isolated?
> If so, why would that be considered proper behavior?
> At the very least it is not backward-compatible behavior.
That's right.  Commit above breaks backward-compatibility.

>In Lisp, at least, there is no number at point, in `foo-2'.
>That is, the Lisp parser (reader) would never pick up the
>`2' as a number here.
The doc string of `list-at-point' clearly says that the list should
be a Lisp list.  In the case of `number-at-point' the doc string just
says 'the number at point', without connection with the Lisp parser.

>IOW, I agree with the bug report that `form-at-point'
>should - somehow - handle the case where `thing-at-point'
>returns a non-string.  There is a bug to be fixed.  But
>I'm not convinced that the fix we've implemented is TRT.
Sure, I am open to alternative fixes.






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

* bug#24969: 26.0.50; number-at-point
  2016-11-21  6:48                 ` Andreas Röhler
@ 2016-11-21 14:22                   ` Drew Adams
  0 siblings, 0 replies; 15+ messages in thread
From: Drew Adams @ 2016-11-21 14:22 UTC (permalink / raw)
  To: Andreas Röhler, Noam Postavsky; +Cc: Stephen Berman, 24969

> > But the question is, "What constitutes a numeral?" in the given
> > context.  Whatever the context, I would expect some kind of
> > well-defined delimiting.  In Lisp I would expect what the Lisp
> > reader would pick up as a number - nothing more.
> 
> The perspective of the lisp-programmer and the user of an editor may
> be different here.

Too vague.

> The implementation at progress should pick any valid hex- octal- or
> decimal integer at point.

I disagree.  Users should control whether they want a decimal,
octal, or hex number at point - or any kind of number.  Those
are different things.  In my code I define hex and decimal number
at point functions.  When code wants to get only a decimal number
it does not want to pick up `FACE'.  When code wants an octal
number it does not want `987'.

And nothing prevents a given context from defining a "number"
category.  That's we had, for Lisp numbers.  Other modes are
free to define a number syntax such that the (previous)
implementation of `number-at-point' - or any local,
mode/context-specific implementation, is in charge.

> In a related case even characters are raised here, returning
> a "b" for an "a", an "y" for an "x" etc.

Far too loose and useless.  Thingatpt lets you define any number
of specific kinds of things.  A predefined catch-all that does
lots of things that are not clear is not helpful.

> > In Lisp I would expect what the Lisp reader would pick up
> > as a number - nothing more.  And that would exclude picking
> > up `2' within `foo-2'.
> 
> Not, when for example filenames inside shell-scripts etc. are
> edited.

What part of Lisp reader was not clear?  The (previous)
implementation uses what the current mode considers a number.
It is based on the Lisp reader, but users (or Emacs) can define
other number readings.





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

* bug#24969: 26.0.50; number-at-point
  2016-11-21 13:09         ` Tino Calancha
@ 2016-11-21 23:07           ` Drew Adams
  2016-11-22  8:45             ` Andreas Röhler
  0 siblings, 1 reply; 15+ messages in thread
From: Drew Adams @ 2016-11-21 23:07 UTC (permalink / raw)
  To: Tino Calancha; +Cc: Stephen Berman, 24969, npostavs

> > In Emacs 25.1 (emacs -Q), `number-at-point' at either
> > the `-' or the `1' returns nil, for me.  And I do not
> > see why it should return a number.
> >
> > `number-at-point' is defined using `form-at-point' with
> > THING `sexp' and predicate `numberp'.  The sexp picked
> > up at point is `foo-1', and that fails `numberp'.
>
> From the time when i opened Bug#24605, the
> implementation, in master branch, of `number-at-point'
> was different: it changed in commit 786ab4a5 (Bug#8634).
> My patch was driven by this implementation.  I didn't notice
> that `number-at-point' behaves different in emacs-25.

It behaves the same in Emacs 25.1 as previously.  If something
broke this after Emacs 25.1 then it should be reverted.

> > What am I missing?  Why should this rightfully return
> > a number?  I'm guessing that you are all using a more
> > recent version of `number-at-point' than what is in
> > Emacs 25.1 (?).  But to me the Emacs 25.1 behavior I
> > see (i.e., returning nil) is correct.
> >
> > Did someone change the meaning of `number-at-point'
> > so that it now picks up a numeral that is not isolated?
> > If so, why would that be considered proper behavior?
> > At the very least it is not backward-compatible behavior.
>
> That's right.  Commit above breaks backward-compatibility.

If it returns a number for point on a numeral in the middle
of a symbol name etc. then it breaks not only backward
compatibility - it breaks the very notion of a number at
point.  A number at point should be a number as delimited
and distinguished in the current mode.

The longstanding definition uses Lisp `read', so it distinguishes
a _Lisp_ number.  It uses what Lisp uses to delimit a numeral.

A better implementation of `number-at-point' than what has
always existed would do this:

1. Get (thing-at-point 'sexp)
2. If it is not a string, return nil.
3. Else match it against a regexp that tests for a numeral
   in the current mode/context.  Or use another such test
   other than regexp matching.  If there the mode/context
   defines numeric syntax then perhaps use a function that
   tests that way.
4. For Lisp, the result must coincide with the longstanding
   behavior, one way or another.

Unless `number-at-point' is extended in such a way, it should
simply be restored to what it has always been.  It's behavior
in Lisp should in any case be to return a Lisp number.

I think that its behavior should remain what it was (a Lisp
number), and any more general function that does as just
described (1 to 4) should be given another name.

FWIW, this is how I define `hex-number-at-point'.  It does
not take into account the special syntax of any current mode
or other context.  It gets a sexp at point and matches it
against hex digits.  But (thing-at-point 'sexp) can have
different behavior in different modes/contexts.

(defun number-at-point-hex ()
  "Return the number represented by the hex numeral at point.
Return nil if none is found."
  (let ((strg  (tap-thing-at-point 'sexp)))
    (and (stringp strg)
         (string-match-p "\\`[0-9a-fA-F]+\\'" strg)
         (string-to-number strg 16))))

(put 'hex-number 'bounds-of-thing-at-point 'bounds-of-number-at-point-hex)

(defun bounds-of-number-at-point-hex ()
  "Return bounds of number represented by the hex numeral at point.
Return nil if none is found."
  (and (number-at-point-hex)  (bounds-of-thing-at-point 'sexp)))

> >In Lisp, at least, there is no number at point, in `foo-2'.
> >That is, the Lisp parser (reader) would never pick up the
> >`2' as a number here.
>
> The doc string of `list-at-point' clearly says that the list should
> be a Lisp list.  In the case of `number-at-point' the doc string
> just says 'the number at point', without connection with the Lisp
> parser.

See above.  It has always been a Lisp number - it has always
used `form-at-point' and hence the Lisp function `read'.
Things in thingatpt.el were Lisp from the beginning.  If the
doc doesn't always call out that behavior then it can be updated
to do so.

> >IOW, I agree with the bug report that `form-at-point'
> >should - somehow - handle the case where `thing-at-point'
> >returns a non-string.  There is a bug to be fixed.  But
> >I'm not convinced that the fix we've implemented is TRT.
>
> Sure, I am open to alternative fixes.

See above for one suggestion.  But what is a _general_ number
at point?

Ideally, `number-at-point' should depend on the given context
(e.g. mode - how numerals are recognized and represented in
the given programming language or whatever.  But what about a
default behavior, for a mode that has no notion of numeral?

You can perhaps look to what I've done for decimal and hex
numbers: get a sexp at point and check that it is a string
that matches a regexp that specifies a decimal or hex numeral.
(`sexp' is mode-dependent, of course.)

The definitions I use are pretty simple.  They don't try to
take into account signs or decimal points, for instance.
We can do better, no doubt.  We should have different kinds
of `*-number-at-point' functions, for grabbing numbers that
are decimal integers and natural numbers, numerals in exponential
notation, hex, octal, etc.

But the basic `number-at-point' should be, well basic.  It should
not try to recognize all of the above.  It should just recognize,
for example, decimal numerals that use simple notation.

We could do worse than use Lisp numerals as the basic number
notation, I think.  And in any case, the current mode should
decide what delimits a number.  I do not want to see our
basic `number-at-point' pick up 3 or -3 from the middle of
`foo-3-bar' or -1 from `-'.  Such behavior flies in the face
of what thingatpt is about, IMO.





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

* bug#24969: 26.0.50; number-at-point
  2016-11-21 23:07           ` Drew Adams
@ 2016-11-22  8:45             ` Andreas Röhler
  0 siblings, 0 replies; 15+ messages in thread
From: Andreas Röhler @ 2016-11-22  8:45 UTC (permalink / raw)
  To: Drew Adams, Tino Calancha; +Cc: Stephen Berman, 24969, npostavs



On 22.11.2016 00:07, Drew Adams wrote:
>>> In Emacs 25.1 (emacs -Q), `number-at-point' at either
>>> the `-' or the `1' returns nil, for me.  And I do not
>>> see why it should return a number.
>>>
>>> `number-at-point' is defined using `form-at-point' with
>>> THING `sexp' and predicate `numberp'.  The sexp picked
>>> up at point is `foo-1', and that fails `numberp'.
>>  From the time when i opened Bug#24605, the
>> implementation, in master branch, of `number-at-point'
>> was different: it changed in commit 786ab4a5 (Bug#8634).
>> My patch was driven by this implementation.  I didn't notice
>> that `number-at-point' behaves different in emacs-25.
> It behaves the same in Emacs 25.1 as previously.  If something
> broke this after Emacs 25.1 then it should be reverted.
>
>>> What am I missing?  Why should this rightfully return
>>> a number?  I'm guessing that you are all using a more
>>> recent version of `number-at-point' than what is in
>>> Emacs 25.1 (?).  But to me the Emacs 25.1 behavior I
>>> see (i.e., returning nil) is correct.
>>>
>>> Did someone change the meaning of `number-at-point'
>>> so that it now picks up a numeral that is not isolated?
>>> If so, why would that be considered proper behavior?
>>> At the very least it is not backward-compatible behavior.
>> That's right.  Commit above breaks backward-compatibility.
> If it returns a number for point on a numeral in the middle
> of a symbol name etc. then it breaks not only backward
> compatibility - it breaks the very notion of a number at
> point.  A number at point should be a number as delimited
> and distinguished in the current mode.
>
> The longstanding definition uses Lisp `read', so it distinguishes
> a _Lisp_ number.  It uses what Lisp uses to delimit a numeral.
>
> A better implementation of `number-at-point' than what has
> always existed would do this:
>
> 1. Get (thing-at-point 'sexp)
> 2. If it is not a string, return nil.
> 3. Else match it against a regexp that tests for a numeral
>     in the current mode/context.  Or use another such test
>     other than regexp matching.  If there the mode/context
>     defines numeric syntax then perhaps use a function that
>     tests that way.
> 4. For Lisp, the result must coincide with the longstanding
>     behavior, one way or another.
>
> Unless `number-at-point' is extended in such a way, it should
> simply be restored to what it has always been.  It's behavior
> in Lisp should in any case be to return a Lisp number.
>

Why? A lisp-number is useful for further computations, for adding them 
for example.
It's not useful when editing the numbers text at point.

As (thing-at-point 'sexp) internally will get the buffer-substring with 
the number's literal, why not make is accessible for edits?









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

* bug#24969: 26.0.50; number-at-point
  2016-11-20 12:47 bug#24969: 26.0.50; number-at-point Andreas Röhler
  2016-11-20 12:53 ` Stephen Berman
@ 2021-08-10 16:18 ` Lars Ingebrigtsen
  1 sibling, 0 replies; 15+ messages in thread
From: Lars Ingebrigtsen @ 2021-08-10 16:18 UTC (permalink / raw)
  To: Andreas Röhler; +Cc: 24969

Andreas Röhler <andreas.roehler@easy-emacs.de> writes:

> After evaluating show-number in buffer of contents below, it should
> jump to char "1" and return them, but returns nil.
>
> ;;;
>
> foo-1
>
> (defun show-number ()
>   (interactive)
>   (goto-char 5)
>   (message "%s" (number-at-point)))

This has returned -1 since Emacs 26.1 (it used to return nil), and I
think -1 is fine here (since we've asked for a number, and that's a
kinda numberish thing).  (I also see the logic in returning nil in Lisp
buffers, but number-at-point is a DWIM-ish command.)

So I think this works as it's supposed, and I'm closing this bug report.

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





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

end of thread, other threads:[~2021-08-10 16:18 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-20 12:47 bug#24969: 26.0.50; number-at-point Andreas Röhler
2016-11-20 12:53 ` Stephen Berman
2016-11-20 13:53   ` Andreas Röhler
2016-11-20 14:15     ` npostavs
2016-11-20 16:19       ` Drew Adams
2016-11-20 16:35         ` Noam Postavsky
2016-11-20 16:58           ` Drew Adams
2016-11-20 19:26             ` Andreas Röhler
2016-11-20 21:28               ` Drew Adams
2016-11-21  6:48                 ` Andreas Röhler
2016-11-21 14:22                   ` Drew Adams
2016-11-21 13:09         ` Tino Calancha
2016-11-21 23:07           ` Drew Adams
2016-11-22  8:45             ` Andreas Röhler
2021-08-10 16:18 ` 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).