2012-01-14 22 views
6

Một điều đã làm tôi nhớ về Emacs vì tôi chuyển sang nó là tôi chỉ có thể làm cho nó làm nổi bật cú pháp số thập phân chính xác trong mã C. Ví dụ, những con số này được đánh dấu một cách chính xác:Chế độ Emacs C - làm cách nào để bạn làm nổi bật số hex?

1234 
1234l 
1234.5f 

Tuy nhiên những con số KHÔNG nhấn mạnh một cách chính xác:

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

Có thể có Emacs màu mỗi nhân vật trong những con số giống nhau không? Thậm chí tốt hơn nếu số không hợp lệ (như 019 hoặc 0x0g) có thể được tô màu khác nhau để làm nổi bật chúng.

+0

Emacs có một số gói nổi bật khác nhau; 'font-lock-mode' và' hilit19', trong số những thứ khác. Bạn đang sử dụng cái nào? –

+0

Tôi nghi ngờ tiêu chuẩn C-mode sử dụng hilit19 mà tôi chưa bao giờ nghe nói cho đến bây giờ. font-lock có nhiều khả năng hơn. – Tom

+0

Tôi không chắc chắn làm thế nào để nói - tôi sẽ tưởng tượng tôi vẫn đang sử dụng bất cứ điều gì mặc định là. – Malvineous

Trả lời

6

Cảm ơn các con trỏ Mischa Arefiev, nó đã cho tôi tìm kiếm ở các vị trí đúng. Đây là những gì tôi đã đưa ra, và nó bao gồm tất cả các yêu cầu ban đầu của tôi. Giới hạn duy nhất tôi biết ngay bây giờ là nó sẽ làm nổi bật hậu tố số không hợp lệ như thể nó đúng (ví dụ: "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) 
    )) 
)) 

Bất kỳ đề xuất/tối ưu/sửa lỗi nào được chào đón!

CHỈNH SỬA: Đã dừng nó khỏi số đánh dấu trong nhận xét.

+0

có vẻ như điều này sẽ làm nổi bật '0' trong' a.0' dưới dạng một số hợp lệ và '0] .a' trong' a [0] .a' như một số không hợp lệ? (cũng 'f (0) .a' có cùng vấn đề với' a [0] .a') – yuyichao

+0

@yuyichao: Thật không may. Vui lòng thông báo nếu bạn biết cách khắc phục! – Malvineous

+0

Tôi đã cố gắng làm điều đó, một phiên bản không đầy đủ là ở đây https://github.com/yuyichao/emacsrc/blob/master/script/c-cpp.el. Tuy nhiên, nó không làm nổi bật không hợp lệ trôi nổi thực sự tốt, và nó không làm nổi bật số nhị phân hoặc (có thể hoàn thành nó nếu tôi có thời gian, đề nghị chào đón = D) – yuyichao

1

Có lẽ điều này sẽ làm việc:

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

Chúng ta có thể sử dụng các biểu thức chính quy Emacs

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

để phù hợp với số thập lục phân và

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

để phù hợp với bất kỳ số nguyên/float/số khoa học. Chúng sẽ được áp dụng theo thứ tự, tức là lần đầu tiên đăng ký biểu thức số thập lục phân. Đây là những hoạt động tốt cho tôi trong một thời gian dài. Hãy xem this post để có mã Lisp hoàn chỉnh, cũng thêm từ khóa C++ 11.

Các vấn đề liên quan