(require 'font-lock) ;;###autoload (define-minor-mode c++1x-minor-mode "Extra highlighting for c++-mode that includes c++11 and c++14 keywords and features" :lighter "c++1x" (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) (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\\|noexcept\\|\\|static_assert\\|thread_local\\|override\\|final\\)\\>" . font-lock-keyword-face) ("\\<\\(decltype\\)\\>" . font-lock-builtin-face) ("\\<\\(nullptr\\)\\>" . font-lock-constant-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) ;; 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 ))) ;;###autoload (add-hook 'c++-mode-hook 'c++1x-minor-mode) (provide 'c++1x-minor-mode)