【问题标题】:Emacs C mode - how do you syntax highlight hex numbers?Emacs C 模式 - 你如何语法高亮十六进制数字?
【发布时间】:2012-02-10 05:11:03
【问题描述】:

自从我切换到 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)可以用不同的颜色来突出显示,那就更好了。

【问题讨论】:

  • Emacs 有几个不同的高亮包; font-lock-modehilit19 等。你用的是哪个?
  • 我怀疑标准 C 模式使用 hilit19,直到现在我才听说过。字体锁定的可能性更大。
  • 我不知道该怎么说 - 我想我仍然在使用默认值。
  • 标准 Emacs 不会像1234 那样突出显示普通数字,所以你必须有一些额外的包来获得它。无论如何,突出显示所有数字的最佳方法是使用font-lock-add-keywords,除非您可以找到一个包来为您完成。
  • 啊,我的错误 - 我添加了 (font-lock-add-keywords nil '(("[0-9][0-9.]*[lLfF]?" 0 font-lock -string-face))) 到我的 init.el

标签: emacs syntax-highlighting


【解决方案1】:

也许这会起作用:

  (font-lock-add-keywords
   'c-mode
   '(("0x\\([0-9a-fA-F]+\\)" . font-lock-builtin-face)))

【讨论】:

    【解决方案2】:

    感谢 Mischa Arefiev 的指点,它让我找到了正确的地方。这是我想出的,它涵盖了我所有的原始要求。我现在知道的唯一限制是它会突出显示无效的数字后缀,就好像它是正确的一样(例如“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)
        ))
    ))
    

    欢迎提出任何建议/优化/修复!

    编辑:阻止它突出显示 cmets 中的数字。

    【讨论】:

    • 似乎这会将a.0 中的0 突出显示为有效数字,并将a[0].a 中的0].a 突出显示为无效数字? (f(0).a 也有与a[0].a 相同的问题)
    • @yuyichao:不幸的是,确实如此。如果您知道如何解决,请告知!
    • 我已经尝试过了,这里有一个不完整的版本github.com/yuyichao/emacsrc/blob/master/script/c-cpp.el。但是,它并没有很好地突出显示无效浮动,也没有突出显示二进制数(如果我有时间可能会完成它,欢迎建议=D)
    【解决方案3】:

    我们可以使用 Emacs 正则表达式

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

    匹配十六进制数和

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

    匹配任何整数/浮点数/科学数字。它们应按顺序应用,即首先注册十六进制数表达式。这些对我来说已经很长时间了。查看 this post 获取完整的 Lisp 代码,其中还添加了 C++11 关键字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 2010-10-26
      • 2017-08-12
      • 2010-12-24
      • 1970-01-01
      相关资源
      最近更新 更多