2012-01-14 11 views
6

Jedną z rzeczy, która podsłuchiwała mnie na temat Emacsa, odkąd przełączyłem się na to, jest to, że mogę uzyskać to tylko do składni dziesiętnej podświetlenia składni poprawnie w kodzie C. Na przykład, te liczby są podświetlone poprawnie:Tryb Emacs C - jak podświetlasz składnię podając liczby szesnastkowe?

1234 
1234l 
1234.5f 

Jednak liczby te NIE są podświetlone poprawnie:

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

Czy to możliwe, aby mieć Emacs kolor każda postać w te numery są takie same? Jeszcze lepiej, jeśli nieprawidłowe numery (np. 019 lub 0x0g) mogą być inaczej pokolorowane, aby je wyróżnić.

+0

Emacs ma kilka różnych pakietów podświetlających; 'tryb blokady fontów' i 'hilit19', między innymi. Którego używasz? –

+0

Wątpię, aby standardowy tryb C używał hilit19, o którym nigdy wcześniej nie słyszałem. blokada czcionki jest znacznie bardziej prawdopodobna. – Tom

+0

Nie wiem, jak powiedzieć - wyobrażam sobie, że nadal używam tego, co domyślne. – Malvineous

Odpowiedz

6

Dzięki za wskaźnik Mischa Arefiev, zrobiło mi patrząc w odpowiednich miejscach. Właśnie to wymyśliłem i obejmuje wszystkie moje pierwotne wymagania. Jedynym ograniczeniem jestem świadom tej chwili jest to, że podświetlić nieprawidłowy numer przyrostek jakby to było poprawne (na przykład „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) 
    )) 
)) 

Wszelkie sugestie/optymalizacje/poprawki mile widziane!

EDYCJA: Zatrzymano go od podświetlania liczb w komentarzach.

+0

wydaje się, że to podświetli '0' w' a.0' jako poprawną liczbę i '0] .a' w' a [0] .a' jako niepoprawną liczbę? (również 'f (0) .a' ma taki sam problem z' a [0] .a') – yuyichao

+0

@yuyichao: Niestety tak jest. Proszę doradzić, jeśli wiesz, jak to naprawić! – Malvineous

+0

Próbowałem to zrobić, niekompletna wersja jest tutaj https://github.com/yuyichao/emacsrc/blob/master/script/c-cpp.el. jednak nie podświetla on nieprawidłowego pływającego naprawdę dobrze i nie podświetla też liczby binarnej (może ją uzupełnić, jeśli mam czas, sugestia powitania = D) – yuyichao

1

Może to będzie działać:

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

Możemy użyć Emacs wyrażenie regularne

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

dopasować szesnastkowych cyfr i

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

dopasować dowolną liczbą całkowitą/pływaka/numer naukowego. Są one stosowane kolejno, tzn. Najpierw rejestrują wyrażenie w postaci liczby szesnastkowej. Teraz działają one dobrze przez długi czas. Szukaj this post dla pełnego kodu Lisp, który również dodaje słowa kluczowe C++ 11.