2011-12-18 32 views
38

Tôi đang chạy Emacs 23.3.1 (Ubuntu, gói Oneiric) và emacs không xuất hiện để hiểu bất kỳ của mới C++ 11 từ khóa, constexpr, thread_local, vv Ngoài ra nó không hiểu rằng '>> 'hiện được phép trong các tham số mẫu hoặc cú pháp' lớp enum 'mới. Có mô-đun cập nhật hoặc thay thế ở đâu đó không? Hoặc thất bại đó, một số cài đặt để làm cho emacs C + + thân thiện hơn trong thời gian có nghĩa là?Chế độ C++ 11 hoặc cài đặt cho emacs?

+0

Lưu ý rằng 'thread_local' chưa được G ++ hỗ trợ: http://gcc.gnu.org/projects/cxx0x.html Phần mở rộng gcc' __thread' tương tự nhưng không gọi hàm tạo hoặc hàm hủy IIRC. – bdonlan

+0

Tôi đã có cùng một vấn đề với vim, trong đó có một số tập tin cú pháp tôi điều chỉnh. Phải giống nhau cho emacs tôi nghĩ :) – Geoffroy

Trả lời

4

Tôi đã kiểm tra phiên bản thân cây, cc-mode chưa được cập nhật và AFAIK không có thay thế. Nếu bạn thực sự muốn nó, nhưng không muốn để có được bàn tay của bạn bẩn, bạn nên trả một ai đó để thực hiện nó cho bạn ...

+2

thực hiện dự án kickstarter: p –

27

Vâng, tôi đang sử dụng 24.1. Một số từ khóa C++ 98 bị thiếu và tất cả các từ khóa C++ 11 mới. Nó thậm chí không tạo ra các hằng số. Có vẻ như là C++ - chế độ chưa được cập nhật trong một thập kỷ.

Tôi đang sử dụng mã sau trong một thời gian dài và gần đây đã thêm từ khóa C++ 11. Hãy thử đặt nó trong .emacs; nó sẽ lấp đầy một số lỗ.

(require 'font-lock) 

(defun --copy-face (new-face face) 
    "Define NEW-FACE from existing FACE." 
    (copy-face face new-face) 
    (eval `(defvar ,new-face nil)) 
    (set new-face new-face)) 

(--copy-face 'font-lock-label-face ; labels, case, public, private, proteced, namespace-tags 
     'font-lock-keyword-face) 
(--copy-face 'font-lock-doc-markup-face ; comment markups such as Javadoc-tags 
     'font-lock-doc-face) 
(--copy-face 'font-lock-doc-string-face ; comment markups 
     'font-lock-comment-face) 

(global-font-lock-mode t) 
(setq font-lock-maximum-decoration t) 


(add-hook 'c++-mode-hook 
     '(lambda() 
     (font-lock-add-keywords 
     nil '(;; complete some fundamental keywords 
      ("\\<\\(void\\|unsigned\\|signed\\|char\\|short\\|bool\\|int\\|long\\|float\\|double\\)\\>" . font-lock-keyword-face) 
      ;; add the new C++11 keywords 
      ("\\<\\(alignof\\|alignas\\|constexpr\\|decltype\\|noexcept\\|nullptr\\|static_assert\\|thread_local\\|override\\|final\\)\\>" . font-lock-keyword-face) 
      ("\\<\\(char[0-9]+_t\\)\\>" . font-lock-keyword-face) 
      ;; PREPROCESSOR_CONSTANT 
      ("\\<[A-Z]+[A-Z_]+\\>" . font-lock-constant-face) 
      ;; hexadecimal numbers 
      ("\\<0[xX][0-9A-Fa-f]+\\>" . font-lock-constant-face) 
      ;; integer/float/scientific numbers 
      ("\\<[\\-+]*[0-9]*\\.?[0-9]+\\([ulUL]+\\|[eE][\\-+]?[0-9]+\\)?\\>" . font-lock-constant-face) 
      ;; user-types (customize!) 
      ("\\<[A-Za-z_]+[A-Za-z_0-9]*_\\(t\\|type\\|ptr\\)\\>" . font-lock-type-face) 
      ("\\<\\(xstring\\|xchar\\)\\>" . font-lock-type-face) 
      )) 
     ) t) 

Hy vọng điều này sẽ hữu ích.

+5

Điều này thật tuyệt vời! Cảm ơn vì điều này. Tôi sẽ sử dụng điều này từ bây giờ. Bạn có nghĩ đến việc đóng góp cho dự án này không? –

+0

Có lẽ ... tuy nhiên, ai duy trì chế độ cc? Tác giả đầu tiên là RMS (1985), Alan Mackenzie (2003). Tôi sẽ gửi thư đến gnu.org; chúng ta hãy xem những gì họ nói. –

+1

@AndreasSpindler: Bản chỉnh sửa cuối cùng chắc chắn không phải trong năm 2003 - lần kiểm tra gần đây nhất nguồn được cách đây 2 tuần bởi Alan Mackenzie, xem [the changelog] (http://cc-mode.hg.sourceforge.net/hgweb/ cc-mode/cc-mode/log). –

12

Theo yêu cầu của Mike Weller ở đây, một phiên bản cập nhật cho các chuỗi ký tự C++ 11 (bao gồm các chữ cái do người dùng xác định).

(add-hook 
'c++-mode-hook 
'(lambda() 
    ;; We could place some regexes into `c-mode-common-hook', but note that their evaluation order 
    ;; matters. 
    (font-lock-add-keywords 
    nil '(;; complete some fundamental keywords 
      ("\\<\\(void\\|unsigned\\|signed\\|char\\|short\\|bool\\|int\\|long\\|float\\|double\\)\\>" . font-lock-keyword-face) 
      ;; namespace names and tags - these are rendered as constants by cc-mode 
      ("\\<\\(\\w+::\\)" . font-lock-function-name-face) 
      ;; new C++11 keywords 
      ("\\<\\(alignof\\|alignas\\|constexpr\\|decltype\\|noexcept\\|nullptr\\|static_assert\\|thread_local\\|override\\|final\\)\\>" . font-lock-keyword-face) 
      ("\\<\\(char16_t\\|char32_t\\)\\>" . font-lock-keyword-face) 
      ;; PREPROCESSOR_CONSTANT, PREPROCESSORCONSTANT 
      ("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face) 
      ("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face) 
      ;; hexadecimal numbers 
      ("\\<0[xX][0-9A-Fa-f]+\\>" . font-lock-constant-face) 
      ;; integer/float/scientific numbers 
      ("\\<[\\-+]*[0-9]*\\.?[0-9]+\\([ulUL]+\\|[eE][\\-+]?[0-9]+\\)?\\>" . font-lock-constant-face) 
      ;; c++11 string literals 
      ;;  L"wide string" 
      ;;  L"wide string with UNICODE codepoint: \u2018" 
      ;;  u8"UTF-8 string", u"UTF-16 string", U"UTF-32 string" 
      ("\\<\\([LuU8]+\\)\".*?\"" 1 font-lock-keyword-face) 
      ;;  R"(user-defined literal)" 
      ;;  R"(a "quot'd" string)" 
      ;;  R"delimiter(The String Data")delimiter" 
      ;;  R"delimiter((a-z))delimiter" is equivalent to "(a-z)" 
      ("\\(\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\)" 1 font-lock-keyword-face t) ; start delimiter 
      ( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\(.*?\\))[^\\s-\\\\()]\\{0,16\\}\"" 1 font-lock-string-face t) ; actual string 
      ( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?\\()[^\\s-\\\\()]\\{0,16\\}\"\\)" 1 font-lock-keyword-face t) ; end delimiter 

      ;; user-defined types (rather project-specific) 
      ("\\<[A-Za-z_]+[A-Za-z_0-9]*_\\(type\\|ptr\\)\\>" . font-lock-type-face) 
      ("\\<\\(xstring\\|xchar\\)\\>" . font-lock-type-face) 
      )) 
    ) t) 

Trong việc thực hiện trên của người dùng xác định chuỗi literals, các thẻ delimiter được đánh dấu lên riêng biệt như font-lock-keyword-face; một tùy chọn khác là font-lock-constant-face. Việc triển khai này không hiệu quả như nó có thể; nhưng nó hoạt động và không làm chậm Emacs. Lưu ý rằng các regexps cho các chuỗi ký tự do người dùng định nghĩa không bị "đánh cắp" từ đâu đó; vì vậy tôi hy vọng họ làm việc. Mọi bình luận đều được chào đón.

Nếu bạn muốn phông chữ toàn bộ chuỗi ký tự là font-lock-string-face - bao gồm dấu phân tách - thay thế ba regex theo chỉ một. Như thế này:

. 
    . 
("\\<\\([uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?)[^\\s-\\\\()]\\{0,16\\}\"\\)\\>" 1 font-lock-string-face t) 

Hãy vui vẻ.

+0

Tôi thích điều này.Tuy nhiên, nó không làm nổi bật chính xác các chuỗi ký tự nhiều dòng. ! [Xem này] (http://i39.tinypic.com/2z6v5o6.jpg). –

+0

Được rồi, đó là vì '.' không khớp với dòng mới. Sửa lỗi bằng cách thay thế tất cả '. *' Bằng '[[: ascii:] [: nonascii:]] *' –

+0

Tuy nhiên, tôi không hiểu tại sao nó làm nổi bật một số ký tự trích dẫn chuỗi có màu đỏ. [Xem này] (http://i41.tinypic.com/16ld3iw.jpg). –

5

Thay thế regexp của dấu phẩy động '' bằng cách này sẽ cải thiện sự chập chờn của phao.

integer/float/scientific literals 
("\\<[-+]?[0-9]*\\.?[0-9]+\\([uUlL]+\\|[eE][-+]?[0-9]+\\)?[fFlL]?\\>" . font-lock-constant-face) 

Hy vọng sẽ giúp ai đó.

7

Hãy xem gói: "Modern C++" font-lock for Emacs. Nó cũng có sẵn trên Melpa.

Hỗ trợ đánh dấu cú pháp cho "Modern C++" - cho đến khi C++ 17 và Đặc điểm kỹ thuật. Gói này nhằm mục đích cung cấp một điểm nhấn đơn giản của ngôn ngữ C++ mà không phụ thuộc.

Bạn nên sử dụng nó cùng với chế độ chính chế độ C++ - chế độ để làm nổi bật thêm (loại người dùng xác định, chức năng, v.v.) và thụt đầu dòng.

Tôi là người duy trì chế độ nhỏ này. Mọi phản hồi đều được đánh giá cao.

0

Đối với tôi, hai điểm đau cấp bách nhất với font-khóa của C hiện đại ++ mã đã được

  1. thực tế là auto được đánh dấu như một từ khóa (và không phải là một loại) và do đó nhận dạng sau đây sẽ thông thường không phải là một báo cáo biến, và
  2. làm nổi bật đơn giản khi hiển thị một số mã (ví dụ: hãy thử rtags 'src/ClangIndexer.cpp) và sau đó không làm nổi bật các cấu trúc cấp cao như định nghĩa chức năng.

Sau một chút thử nghiệm, tôi đã đến một giải pháp hoạt động tốt cho tôi và xử lý cả hai điểm.

Người đầu tiên được thực hiện bằng cách sửa đổi lisp/progmodes/cc-langs.el (sao chép một của load-path và sau đó sửa đổi cũng làm việc) để loại bỏ"auto" từ

(c-lang-defconst c-modifier-kwds 
    "Keywords that can prefix normal declarations of identifiers 

thêm nó để c++-font-lock-extra-types (ví dụ qua Customize).

Đối với mục thứ hai, làm trống c++-font-lock-extra-types (ngoại trừ việc giữ "auto") sẽ giúp.

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