38 votes

Mode C ++11 ou paramètres pour emacs?

J'utilise Emacs 23.3.1 (paquet Ubuntu, Oneiric) et emacs ne semble comprendre aucun des nouveaux mots-clés C ++ 11, constexpr, thread_local, etc. Il ne comprend pas non plus que '>>' est désormais autorisé dans les paramètres de modèle, ou la nouvelle syntaxe 'enum class'. Existe-t-il un module mis à jour ou alternatif quelque part? Ou, à défaut, certains paramètres pour rendre Emacs plus convivial pour C ++ 11 entre-temps?

27voto

Andreas Spindler Points 1612

Eh bien, j'utilise 24.1. Il manque certains mots-clés C ++ 98 et tous les nouveaux mots-clés C ++ 11. Il ne même pas fontifier les constantes numériques. Il semble que c ++ - le mode n'a pas été mis à jour depuis une décennie.

J'utilise le code suivant depuis longtemps maintenant et j'ai récemment ajouté des mots-clés C ++ 11. Essayez de le mettre dans votre .emacs ; il devrait combler des trous.

 (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)
 

J'espère que cela t'aides.

13voto

Andreas Spindler Points 1612

Conformément à une demande présentée par Mike Weller ici une version mise à jour pour le C++11 chaînes de caractères littéraux (incl. défini par l'utilisateur littéraux).

(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)

Ci-dessus la mise en œuvre de chaînes de caractères littéraux, le délimiteur balises sont marqués séparément font-lock-keyword-face; une autre option serait d' font-lock-constant-face. Cette mise en œuvre n'est pas aussi efficace qu'elle pourrait l'être; mais il fonctionne et ne ralentit pas Emacs. Notez que les expressions régulières définies par l'utilisateur chaînes de caractères littéraux n'ont pas été "volée" à partir de somehere; j'espère donc qu'ils travaillent. Tous les commentaires sont les bienvenus.

Si vous aimez fontify l'ensemble de la chaîne littérale comme font-lock-string-face - y compris les délimiteurs - remplacer les trois expressions régulières par une seule. Comme celui-ci:

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

Avoir du plaisir.

5voto

Fatlimey Points 23

Remplacer l'expression rationnelle à virgule flottante d'Andreas par ceci améliorera le hilighting des flotteurs.

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

J'espère que ça aide quelqu'un.

4voto

Ismael Points 647

J'ai vérifié la version du coffre, cc-mode n'a pas encore été mis à jour et, autant que je sache, il n'y a pas d'alternative. Si vous le voulez vraiment, mais que vous ne voulez pas vous salir les mains, vous devriez payer quelqu'un pour le mettre en œuvre pour vous ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X