diff --git a/init/init-cpp.el b/init/init-cpp.el index 63fae8782..888fab169 100644 --- a/init/init-cpp.el +++ b/init/init-cpp.el @@ -27,6 +27,76 @@ ac-source-words-in-same-mode-buffers ))) +;; Implement some C++11 Support until cc-mode is updated +(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() + ;; 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) + +;; Fix enum and C++11 lambda indentation +(defadvice c-lineup-arglist (around my activate) + "Improve indentation of continued C++11 lambda function opened as argument." + (setq ad-return-value + (if (and (equal major-mode 'c++-mode) + (ignore-errors + (save-excursion + (goto-char (c-langelem-pos langelem)) + ;; Detect "[...](" or "[...]{". preceded by "," or "(", + ;; and with unclosed brace. + (looking-at ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$")))) + 0 ; no additional indent + ad-do-it))) ; default behavior + (use-package glsl-mode :mode (("\\.glsl\\'" . glsl-mode) ("\\.vert\\'" . glsl-mode)