2012-01-14 15 views
6

Una cosa che mi ha infastidito su Emacs da quando sono passato ad esso è che posso solo sintonizzarmi sull'evidenziazione dei numeri decimali correttamente nel codice C. Ad esempio, questi numeri sono evidenziati in modo corretto:Modalità Emacs C: come si sintonizzano i numeri esadecimali evidenziati?

1234 
1234l 
1234.5f 

Tuttavia questi numeri sono evidenziati non correttamente:

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

E 'possibile avere il colore Emacs ogni personaggio in questi numeri la stessa cosa? Ancora meglio se i numeri non validi (come 019 o 0x0g) possono essere colorati in modo diverso per farli risaltare.

+0

Emacs ha diversi pacchetti di evidenziazione; 'font-lock-mode' e' hilit19', tra gli altri. Quale stai usando? –

+0

Dubito che la modalità C standard usi hilit19 di cui non ho mai sentito parlare fino ad ora. il font-lock è molto più probabile. – Tom

+0

Non sono sicuro di come dirlo, immagino che continuerò ad usare qualunque sia l'impostazione predefinita. – Malvineous

risposta

6

Grazie per il puntatore Mischa Arefiev, mi ha fatto guardare nei posti giusti. Questo è quello che ho trovato, e copre tutte le mie esigenze originali. L'unica limitazione Sono consapevole di questo momento è che si metterà in evidenza un suffisso numero non valido, come se fosse corretto (ad esempio "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) 
    )) 
)) 

Eventuali suggerimenti/ottimizzazioni/correzioni benvenuti!

MODIFICA: interrotto dall'evidenziazione dei numeri all'interno dei commenti.

+0

sembra che questo evidenzi '0' in' a.0' come numero valido e '0] .a' in' a [0] .a' come numero non valido? (anche 'f (0) .a' ha lo stesso problema con' a [0] .a') – yuyichao

+0

@yuyichao: Lo fa, sfortunatamente. Si prega di avvisare se si sa come risolvere! – Malvineous

+0

Ho provato a farlo, una versione incompleta è qui https://github.com/yuyichao/emacsrc/blob/master/script/c-cpp.el. tuttavia, non evidenzia bene il floating non valido e non evidenzia il numero binario (potrebbe completarlo se ho tempo, suggerimento welcome = D) – yuyichao

1

Forse questo funzionerà:

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

possiamo usare l'espressione regolare Emacs

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

per abbinare numeri esadecimali e

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

per adattarsi a qualsiasi/float numero intero/scientifica. Devono essere applicati in sequenza, cioè prima registrare l'espressione numerica esadecimale. Questi stanno funzionando bene per me ora da molto tempo. Guarda this post per il codice Lisp completo, che aggiunge anche parole chiave C++ 11.

Problemi correlati