Emacs CC-mode indentation problème avec C++0x enum classe
Emacs cc-mode ne semble pas encore reconnaître le type-safe enum class
introduit en C++0x. le résultat que j'obtiens est une double indentation pour les énumérations second, third, etc:
enum class Color {
Blue,
Red,
Orange,
Green
};
Ce que je voudrais, c'est:
enum class Color {
Blue,
Red,
Orange,
Green
};
Pouvez-vous recommander une bonne commande à ajouter à .emacs
qui rendra CC-mode treat enum class
de la même manière qu'il traite l'ancien enum
?
1 réponses
C'est le problème:
Cc-mode repose quelque peu sur l'hypothèse que les mots-clés sont des mots simples. Ajouter le support de enum_class
au lieu de {[2] } serait juste une question de changer quelques expressions rationnelles.
Au lieu de cela, Emacs traite cela comme une classe. La bonne façon de résoudre ce problème serait d'enseigner à Emacs qu'il s'agit d'une énumération. Mais c'est au-delà de la portée d'une réponse.
C'est le hack:
Nous allons donc modifier l'indentation existante pour se comporter différemment dans ce cas. (Code disponible pour bricoler dans ce gist .)
(defun inside-class-enum-p (pos) "Checks if POS is within the braces of a C++ \"enum class\"." (ignore-errors (save-excursion (goto-char pos) (up-list -1) (backward-sexp 1) (looking-back "enum[ \t]+class[ \t]+[^}]+")))) (defun align-enum-class (langelem) (if (inside-class-enum-p (c-langelem-pos langelem)) 0 (c-lineup-topmost-intro-cont langelem))) (defun align-enum-class-closing-brace (langelem) (if (inside-class-enum-p (c-langelem-pos langelem)) '- '+)) (defun fix-enum-class () "Setup `c++-mode' to better handle \"class enum\"." (add-to-list 'c-offsets-alist '(topmost-intro-cont . align-enum-class)) (add-to-list 'c-offsets-alist '(statement-cont . align-enum-class-closing-brace))) (add-hook 'c++-mode-hook 'fix-enum-class)
Ce n'est pas fortement testé. ;)
Comment ça marche:
c-offsets-alist
détermine l'indentation pour différentes positions dans l'arbre syntaxique. On peut lui attribuer des constantes ou des fonctions.
Ces deux fonctions déterminent si la position actuelle est à l'intérieur du enum class {...}
. Si c'est le cas, ils renvoient 0 ou '-, que le mode cc interprète comme une profondeur d'indentation. Si ce n'est pas le cas, ils renvoient la valeur par défaut valeur.
inside-class-enum-p
Il suffit de passer à l'Accolade précédente et de vérifier si le texte avant qu'il ne soit "classe enum".