highlight-numbers icon indicating copy to clipboard operation
highlight-numbers copied to clipboard

Support Python mode

Open asmeurer opened this issue 4 years ago • 3 comments

Whatever it is using by default for Python mode works pretty well because it just highlights any token that starts with a number as a number, and any such thing in Python is either a number or invalid syntax. The one exception is that it doesn't highlight the . in floating point numbers correctly.

asmeurer avatar Nov 14 '19 00:11 asmeurer

Many programming languages have the same syntax. For instance, Java, C#, C, C++, etc. It would be nice if this feature is implemented! ;)

jcs090218 avatar Nov 05 '20 03:11 jcs090218

Try this:

;; https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals
(defvar highlight-numbers-py-bindigit '(any "01"))
(defvar highlight-numbers-py-octdigit '(any "0-7"))
(defvar highlight-numbers-py-hexdigit '(any "0-9" "a-f" "A-F"))
(defvar highlight-numbers-py-nonzerodigit '(any "1-9"))
(defvar highlight-numbers-py-decinteger
  '(or (and (eval highlight-numbers-py-nonzerodigit)
            (0+ (and (? "_") digit)))
       (and (1+ "0") (0+ (and (? "_") "0")))))
(defvar highlight-numbers-py-bininteger
  '(and "0" (any "bB") (1+ (and (? "_") (eval highlight-numbers-py-bindigit)))))
(defvar highlight-numbers-py-octinteger
  '(and "0" (any "oO") (1+ (and (? "_") (eval highlight-numbers-py-octdigit)))))
(defvar highlight-numbers-py-hexinteger
  '(and "0" (any "oO") (1+ (and (? "_") (eval highlight-numbers-py-hexdigit)))))
(defvar highlight-numbers-py-integer
  '(or (eval highlight-numbers-py-decinteger)
       (eval highlight-numbers-py-bininteger)
       (eval highlight-numbers-py-octinteger)
       (eval highlight-numbers-py-hexinteger)))

(defvar highlight-numbers-py-digitpart '(and (any "0-9") (0+ (any "_" digit))))
(defvar highlight-numbers-py-fraction
  '(and "." (eval highlight-numbers-py-digitpart)))
(defvar highlight-numbers-py-pointfloat
  '(or (and (? (eval highlight-numbers-py-digitpart))
            (eval highlight-numbers-py-fraction))
       (and (eval highlight-numbers-py-digitpart) ".")))
(defvar highlight-numbers-py-exponent
  '(and (any "eE")
        (? (any "-+"))
        (eval highlight-numbers-py-digitpart)))
(defvar highlight-numbers-py-exponentfloat
  '(and (or (eval highlight-numbers-py-digitpart)
            (eval highlight-numbers-py-pointfloat))
        (eval highlight-numbers-py-exponent)))
(defvar highlight-numbers-py-floatnumber
  '(or (eval highlight-numbers-py-pointfloat)
       (eval highlight-numbers-py-exponentfloat)))

(defvar highlight-numbers-py-imagnumber
  '(and (or (eval highlight-numbers-py-floatnumber)
            (eval highlight-numbers-py-digitpart))
        (any "jJ")))

(setq highlight-numbers-generic-regexp
      (rx (and symbol-start
               (or (eval highlight-numbers-py-imagnumber)
                   (eval highlight-numbers-py-floatnumber)
                   (eval highlight-numbers-py-integer))
               symbol-end)))

or https://github.com/Yevgnen/highlight-numbers-extra

Yevgnen avatar Sep 10 '21 14:09 Yevgnen

This seems to solve the issue,

(setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")

jcs090218 avatar Oct 12 '22 19:10 jcs090218