C ++ 11模式或emacs的设置?
我正在运行Emacs 23.3.1(Ubuntu,Oneiric软件包),emacs似乎并不了解任何新的C ++ 11关键字,constexpr,thread_local等。另外它不明白'>>'是现在允许使用模板参数,或新的“枚举类”语法。 有没有更新或替代模块? 或者做不到这一点,一些设置,使emacs更多的C + + 11友好的同时?
我已经检查了中继版本, cc-mode
还没有更新,AFAIK没有其他select。 如果你真的想要它,但不想弄脏你的手,你应该付钱给你实施它。
那么,我正在使用24.1。 一些C ++ 98关键字缺失,以及所有新的C ++ 11关键字。 它甚至不支持数字常量。 看来好像c ++模式已经有十年没有更新了。
我现在正在使用下面的代码,并且最近添加了C ++ 11关键字。 尝试把它放在你的.emacs中 ; 它应该填补一些漏洞。
(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 ("\\<[AZ]+[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)
希望这可以帮助。
根据Mike Weller的要求,这里是C ++ 11string文字(包括用户定义文字)的更新版本。
(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 ("\\<[AZ]*_[A-Z_]+\\>" . font-lock-constant-face) ("\\<[AZ]\\{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((az))delimiter" is equivalent to "(az)" ("\\(\\<[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)
在上面用户定义的string文字的实现中,定界符标签被分别标记为font-lock-keyword-face
; 另一个选项是font-lock-constant-face
。 这个实现并不像它可能的那样高效。 但它的工作原理并不会减慢Emacs。 请注意,用户定义的string文字的正则expression式并没有被“偷”到某处; 所以我希望他们工作。 任何意见,欢迎。
如果你想把整个文字string作为font-lock-string-face
– 包括分隔符 – 把三个font-lock-string-face
replace成一个。 像这个:
. . ("\\<\\([uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?)[^\\s-\\\\()]\\{0,16\\}\"\\)\\>" 1 font-lock-string-face t)
玩的开心。
看看这个包: Emacs的“Modern C ++”字体锁 。 它也可以在Melpa上使用 。
语法突出显示支持“Modern C ++” – 直到C ++ 17和Technical Specification。 这个包旨在提供一个简单的C ++语言高亮而不依赖。
除了c ++模式主模式之外,还推荐使用它来额外突出显示(用户定义的types,函数等)和缩进。
我是这个小模式的维护者。 任何反馈意见。
用这个replaceAndreas的浮点正则expression式可以改善浮点数的高亮度。
integer/float/scientific literals ("\\<[-+]?[0-9]*\\.?[0-9]+\\([uUlL]+\\|[eE][-+]?[0-9]+\\)?[fFlL]?\\>" . font-lock-constant-face)
希望能帮助别人。
对我来说,现代C ++代码字体locking的两个最紧迫的问题是
-
auto
被突出显示为一个关键字(而不是一个types),因此后面的标识符通常不会作为variables声明的事实,以及 - 当呈现一些代码(例如,尝试rtags的
src/ClangIndexer.cpp
)时,突出显示src/ClangIndexer.cpp
,然后例如不能突出显示顶层构造(如函数定义)。
经过一番实验,我得出了一个适合我的解决scheme,并解决了这两个问题。
第一个是通过修改lisp/progmodes/cc-langs.el
(复制到一个的load-path
,然后修改也可以)来实现删除 "auto"
(c-lang-defconst c-modifier-kwds "Keywords that can prefix normal declarations of identifiers
并将其添加到c++-font-lock-extra-types
(例如通过自定义)。
对于第二个,清空c++-font-lock-extra-types
(保持"auto"
除外)有帮助。