Режим Emacs C - как вы синтаксически выделяете шестнадцатеричные числа? - PullRequest
6 голосов
/ 14 января 2012

Одна вещь, которая меня беспокоит в Emacs с тех пор, как я переключился на него, заключается в том, что я могу заставить его только правильно синтаксически выделять десятичные числа в C-коде.Например, эти цифры подсвечиваются правильно:

1234
1234l
1234.5f

Однако эти цифры НЕ подсвечиваются правильно:

0x1234  // x is different colour
0xabcd  // no hex digits are coloured
019     // invalid digit 9 is coloured like it is correct

Возможно ли, чтобы Emacs окрашивал каждый символ в этих числах одинаково?Еще лучше, если недопустимые числа (например, 019 или 0x0g) можно по-разному раскрасить, чтобы они выделялись.

Ответы [ 3 ]

6 голосов
/ 15 января 2012

Спасибо за указатель Миша Арефьева, он заставил меня посмотреть в нужных местах. Это то, что я придумал, и оно охватывает все мои первоначальные требования. Единственное ограничение, о котором я сейчас знаю, это то, что он выделит неверный суффикс номера, как если бы он был правильным (например, "123ulu")

(add-hook 'c-mode-common-hook (lambda ()
    (font-lock-add-keywords nil '(

        ; Valid hex number (will highlight invalid suffix though)
        ("\\b0x[[:xdigit:]]+[uUlL]*\\b" . font-lock-string-face)

        ; Invalid hex number
        ("\\b0x\\(\\w\\|\\.\\)+\\b" . font-lock-warning-face)

        ; Valid floating point number.
        ("\\(\\b[0-9]+\\|\\)\\(\\.\\)\\([0-9]+\\(e[-]?[0-9]+\\)?\\([lL]?\\|[dD]?[fF]?\\)\\)\\b" (1 font-lock-string-face) (3 font-lock-string-face))

        ; Invalid floating point number.  Must be before valid decimal.
        ("\\b[0-9].*?\\..+?\\b" . font-lock-warning-face)

        ; Valid decimal number.  Must be before octal regexes otherwise 0 and 0l
        ; will be highlighted as errors.  Will highlight invalid suffix though.
        ("\\b\\(\\(0\\|[1-9][0-9]*\\)[uUlL]*\\)\\b" 1 font-lock-string-face)

        ; Valid octal number
        ("\\b0[0-7]+[uUlL]*\\b" . font-lock-string-face)

        ; Floating point number with no digits after the period.  This must be
        ; after the invalid numbers, otherwise it will "steal" some invalid
        ; numbers and highlight them as valid.
        ("\\b\\([0-9]+\\)\\." (1 font-lock-string-face))

        ; Invalid number.  Must be last so it only highlights anything not
        ; matched above.
        ("\\b[0-9]\\(\\w\\|\\.\\)+?\\b" . font-lock-warning-face)
    ))
))

Любые предложения / оптимизации / исправления приветствуются!

РЕДАКТИРОВАТЬ: остановил его подсветку чисел в комментариях.

1 голос
/ 14 января 2012

Возможно, это будет работать:

  (font-lock-add-keywords
   'c-mode
   '(("0x\\([0-9a-fA-F]+\\)" . font-lock-builtin-face)))
0 голосов
/ 17 октября 2012

Мы можем использовать регулярное выражение Emacs

\<0[xX][0-9A-Fa-f]+

для сопоставления шестнадцатеричных чисел и

\<[\-+]*[0-9]*\.?[0-9]+\([ulUL]+\|[eE][\-+]?[0-9]+\)?

для сопоставления с любым целым числом / числом с плавающей запятой / научным числом.Они должны применяться последовательно, т. Е. Сначала регистрировать шестнадцатеричное числовое выражение.Они работают хорошо для меня сейчас в течение длительного времени.Посмотрите этот пост для полного кода на Лиспе, который также добавляет ключевые слова C ++ 11.

...