[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#16834: 24.3.50; num3-mode detects long hex numbers as decimal
From: |
Michal Nazarewicz |
Subject: |
bug#16834: 24.3.50; num3-mode detects long hex numbers as decimal |
Date: |
Fri, 21 Feb 2014 20:49:26 +0100 |
User-agent: |
Notmuch/0.17+15~gb65ca8e (http://notmuchmail.org) Emacs/24.3.50.1 (x86_64-unknown-linux-gnu) |
On Fri, Feb 21 2014, Stefan Monnier <monnier@iro.umontreal.ca> 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 <felix8a@gmail.com>, Michal Nazarewicz
> <mina86@mina86.com>
> ;; Maintainer: Michal Nazarewicz <mina86@mina86.com>
> @@ -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 +--<mpn@google.com>--<xmpp:mina86@jabber.org>--ooO--(_)--Ooo--
signature.asc
Description: PGP signature