2012-01-14 5 views
6

私がEmacsに切り替えたときに私に迷惑をかけたことの1つは、Cコードで10進数を正しく強調表示するということです。例えば、これらの番号が正しく強調表示されていますEmacs Cモード - 16進数の構文をどのように強調表示しますか?

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など)を色分けして目立たせることができます。

+0

Emacsにはいくつかの異なる強調表示パッケージがあります。 'font-lock-mode'と' hilit19'などがあります。あなたはどちらを使っていますか? –

+0

私は今まで聞いたことのない標準的なCモードの使用hilit19を疑う。フォントロックははるかに可能性があります。 – Tom

+0

私はどのように伝えるべきか分かりません - 私はまだデフォルトが何であれ使用していると思います。 – Malvineous

答えて

6

おかげで、それは私は右の場所で見てしまいました。これは私が思いついたものであり、それは私の元々の必要条件すべてをカバーしています。私は今の承知している唯一の制限は、それが正しい(例えば「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) 
    )) 
)) 

任意の提案/最適化/修正は歓迎します!

EDIT:コメント内の数字をハイライト表示しないようにしました。

+0

これは有効な数字として 'a.0'の' 0'と 'a [0] .a'の' 0。 ( 'f(0).a'も' a [0] .a'と同じ問題を抱えています) – yuyichao

+0

@yuyichao:残念です。修正方法を知っていれば助言してください! – Malvineous

+0

私はそれをやろうとしました。不完全なバージョンはhttps://github.com/yuyichao/emacsrc/blob/master/script/c-cpp.elです。しかし、それは本当にうまくいかない浮動小数点を強調表示せず、2進数を強調表示しません(時間があれば完了するかもしれません、提案は歓迎です= D) – yuyichao

1

おそらく、これは動作します:ポインタミーシャArefievため

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

我々は任意の整数/浮動小数点/科学的な数と一致するように16進数と一致して

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

するEmacsの正規表現に

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

を使用することができます。それらは順番に適用されなければならない、すなわち最初に16進数表現を登録する。これらは長い間、今私にとってうまくいきます。完全なLispコードについてはthis postを見てください。これにはC++ 11のキーワードも追加されています。

関連する問題