33 votes

Problème d'indentation Emacs en mode cc avec la classe C ++ 0x enum

Le mode cc d’Emacs ne semble pas encore reconnaître le enum class sécurité du type introduit dans C ++ 0x. Le résultat obtenu est une double indentation pour les deuxième, troisième, etc.

 enum class Color {
    Blue,
        Red,
        Orange,
        Green
        };
 

Ce que j'aimerais, c'est:

 enum class Color {
    Blue,
    Red,
    Orange,
    Green
};
 

Pouvez-vous recommander une bonne commande à ajouter à .emacs qui fera en sorte que le traitement en mode cc traiter enum class la même manière qu'il traite l'ancien enum ?

27voto

nschum Points 3621

C'est le problème:

cc-mode repose un peu sur l'hypothèse que les mots clés sont des mots simples. Ajout du support pour enum_class au lieu de enum class serait juste une question de changer un peu les expressions régulières.

Au lieu de cela Emacs traite cela comme une classe. La bonne façon de résoudre ce serait enseignement Emacs que c'est un enum. Mais c'est au-delà de la portée de la réponse.

C'est le hack:

Donc, nous allons modifier l'existant en retrait pour se comporter différemment dans ce cas. (Code disponible pour bricoler dans ce résumé.)

(defun à l'intérieur de la classe-enum-p (pos)
 "Vérifie si POS est à l'intérieur des accolades de C++ \"enum class\"."
(ignorer les erreurs
(enregistrez-excursion
 (goto-char op)
 (jusqu'-liste -1)
 (en arrière-sexp 1)
 (en regardant en arrière "enum[ \t]+classe[ \t]+[^}]+"))))

(defun alignez-enum-classe (langelem)
 (si (à l'intérieur de la classe-enum-p (c-langelem-pos langelem))
0
 (c-gamme-supérieur-intro-cont langelem)))

(defun alignez-enum-classe-fermeture corset (langelem)
 (si (à l'intérieur de la classe-enum-p (c-langelem-pos langelem))
'-
'+))

(defun fix-enum-classe ()
 "Le programme d'installation " c++en mode' pour mieux gérer les \"classe enum\"."
 (add-to-list 'c-décalages-accédez à la liste '(celui du haut-intro-cont . alignez-enum-classe))
 (add-to-list 'c-décalages-accédez à la liste
 '(déclaration-suite . alignez-enum-classe-fermeture corset)))

(add-hook 'c++-mode-hook" fix-enum-classe)

Ce n'est pas très testés. ;)

Comment il fonctionne:

c-offsets-alist détermine l'indentation pour différentes positions dans l'arbre syntaxique. Il peut être affecté à des constantes ou des fonctions.

Ces deux fonctions est de savoir si la position actuelle est à l'intérieur de l' enum class {...}. Si c'est le cas, ils return 0 ou '-, cc-mode interprète comme la profondeur de pénétration. Si elle ne l'est pas, ils retournent la valeur par défaut.

inside-class-enum-p déplace simplement le précédent corset et vérifie si le texte avant qu'il soit "enum class".

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