Subject: Re: bug#16834: 24.3.50; num3-mode detects long hex numbers as decimal

From: Michal Nazarewicz <[email-masked]>
Date: Fri, 21 Feb 2014 20:49:26 +0100

On Fri, Feb 21 2014, Stefan Monnier <[email-masked]> wrote:
>> When dealing with large hex numbers the default regex of num3-mode can
>> detect them as decimals.  For example given:
>> V28   : 00000000000000000007fc0000000000 vs 0000000000000000000bfc000000000
>> the follow is high-lighted
>> V28   : __xxx___xxx___xxx_____x___xxx___ vs _xxx___xxx___xxx_________xxx___
>> which is obviously wrong.
>
> I guess we could use the patch below.  Michal, what do you think?

Looks good in general, but this leads to some interesting results:

  “Aaaaaaa” he screamed as the dentist pulled his teeth out.

And if someone sets num3-threshold to 1 and changes num3-face-odd, all
the hexadecimal digits will get highlighted in a regular text even when
they are inside of a word.

I also hope engineers won't get mad when 1000A starts being treated as
a hexadecimal number.  (They should know to put a non-break space
between the number an the unit anyway).

Perhaps this would be better:

(defconst num3--number-re
  (concat "[0#][xX]\\([[:xdigit:]]+\\)"      ; 1 = hexadecimal
       "\\|\\(?1:\\b\\(?:[0-9]+[a-fA-F]\\|"  ; 1 = hexadecimal
                "[a-fA-F]+[0-9]\\)[[:xdigit:]]*\\b\\)"  
       "\\|\\([0-9]+\\)"                         ; 2 = decimal
       "\\|\\.\\([0-9]+\\)"))                    ; 3 = fraction

So there would have to be at least one decimal digit and the whole
sequence would have to be a complete word (i.e. 1000Ah, which would be
a pretty big battery, won't be highlighted as a hexadecimal number).

>> It wouldn't hurt to have customisable faces as well as the default can
>> look quite harsh depending on the theme.
>
> Hmmm... they are, AFAICT (faces num3-face-odd and num3-face-even).

Yep, I have this in my custom.el:

 '(num3-face-even ((t (:foreground "#CFF" :underline nil :weight normal))))

I don't particularly like the defaults myself, but that was what Felix
used in his original code, so I kept it.

> diff --git a/packages/num3-mode/num3-mode.el b/packages/num3-mode/num3-mode.el
> index b890c89..ae3289a 100644
> --- a/packages/num3-mode/num3-mode.el
> +++ b/packages/num3-mode/num3-mode.el
> @@ -1,6 +1,6 @@
>  ;;; num3-mode.el --- highlight groups of digits in long numbers  -*- lexical-binding: t -*-
>  
> -;; Copyright (C) 2012 Free Software Foundation, Inc.
> +;; Copyright (C) 2012, 2014 Free Software Foundation, Inc.
>  
>  ;; Author: Felix Lee <[email-masked]>, Michal Nazarewicz <[email-masked]>
>  ;; Maintainer: Michal Nazarewicz <[email-masked]>
> @@ -98,7 +98,10 @@ where) decimal point (would be) is."
>  (define-globalized-minor-mode global-num3-mode num3-mode num3-mode)
>  
>  (defconst num3--number-re
> -  (concat    "\\(?:0[xX]\\|#\\)\\([0-9a-fA-F]+\\)"  ; 1 = hexadecimal
> +  ;; Recognize "0x" and "#x" as prefixes announcing hexadecimal (from C and
> +  ;; Elisp, respectively).
> +  (concat    "[0#][xX]\\([[:xdigit:]]+\\)"  ; 1 = hexadecimal
> +          "\\|\\(?1:[[:xdigit:]]*[a-fA-F][[:xdigit:]]*\\)" ; 1 = hexadecimal
>            "\\|\\([0-9]+\\)"                         ; 2 = decimal
>            "\\|\\.\\([0-9]+\\)"))                    ; 3 = fraction
>  

-- 
Best regards,                                         _     _
.o. | Liege of Serenely Enlightened Majesty of      o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz    (o o)
ooo +--<[email-masked]>--<xmpp:[email-masked]>--ooO--(_)--Ooo--