2010-04-30 11 views
4

J'ai un problème avec l'indentation d'Emacs des enums Java. Bien qu'il indente le premier membre OK, il veut donner à tous les membres enum statiques un niveau supplémentaire d'indentation. Il ressemble à ceci:Emacs enum indentation

class MyClass { 
    public enum MyEnum { 
     ONE(1), //good 
      TWO(2), // not good! 
      THREE(3), 
      FOUR(4); 
     private final int value; 
    } 
} 

Quand je lance C-c C-s sur la ligne qui ouvre la ENUM, il me donne ((inclass 1) (topmost-intro 1)), qui ne semble pas tout à fait raison - il semble que cela devrait donner brace-list-open. Quand je l'exécute sur le premier membre enum, cela me donne ((defun-block-intro 21)), ce qui n'est certainement pas correct. Chaque membre suivant donne (statement-cont 50).

Je suis en mode java et j'utilise le style d'indentation java. Est-ce que quelqu'un sait quel pourrait être le problème?

Répondre

4

Le problème est qu'Emacs ne prend pas en charge les fonctionnalités de langage Java ajoutées dans la version 1.5 ou ultérieure. Vous aurez également des problèmes avec les génériques, par exemple.

EDIT: Incroyablement, la recherche de Google pour "java enum site: debbugs.gnu.org" ne donne aucun résultat. Je suggère de déposer un bug.

+0

Bogue transmis via Emacs. Nous verrons ce qui se passe, je suppose. – Masterofpsi

+0

oui, il est aussi étonnant que le support d'emacs pour Java soit arrêté, quoi, 2003? – Cheeso

+0

J'ai travaillé sur le support de Java, en fait - je viens de terminer (je pense) tout, donc il devrait être vérifié en mode CC très bientôt. C'est l'un des problèmes qu'il a résolus. –

0

Vous pouvez essayer d'utiliser JDEE - J'ai entendu dire qu'ils prévoyaient d'inclure une prise en charge de Java 6. Ou si vous êtes plus aventureux, vous pouvez essayer malabar-mode, qui prétend être un meilleur mode java que JDEE. Assez drôle le dernier commit dans malabar (d'il y a un jour) a le message suivant - "Fix enum constante indentation" :-)

+0

La dernière relase de JDEE non seulement indente mal les enums, mais indente en fait l'accolade fermante de l'enum au même niveau que les membres mal indentés. – Masterofpsi

+0

Cela ne me surprend pas. Mes espoirs pour le malabar sont cependant beaucoup plus grands. –

1

Le même problème existait en mode csharp jusqu'à la semaine dernière. La façon dont je l'ai réparé était d'ajouter un nouveau matcher dans le paramètre c-basic-matchers-after pour le langage csharp. Le nouveau matcher ressemble à ceci:

;; Case 2: declaration of enum with or without an explicit base type 
,@(when t 
    `((,(byte-compile 
     `(lambda (limit) 
      (let ((parse-sexp-lookup-properties 
        (cc-eval-when-compile 
        (boundp 'parse-sexp-lookup-properties)))) 
       (while (re-search-forward 
         ,(concat csharp-enum-decl-re 
           "[ \t\n\r\f\v]*" 
           "{") 
         limit t) 
       (unless 
        (progn 
         (goto-char (match-beginning 0)) 
         (c-skip-comments-and-strings limit)) 
        (progn 
        (save-match-data 
         (goto-char (match-end 0)) 
         (c-put-char-property (1- (point)) 
              'c-type 
              'c-decl-id-start) 
         (c-forward-syntactic-ws)) 
        (save-match-data 
         (c-font-lock-declarators limit t nil)) 
        (goto-char (match-end 0)) 
        ) 
       ))) 
      nil)) 
     ))) 

csharp-enum-decl-re est défini comme

(defconst csharp-enum-decl-re 
    (concat 
    "\\<enum[ \t\n\r\f\v]+" 
    "\\([[:alpha:]_][[:alnum:]_]*\\)" 
    "[ \t\n\r\f\v]*" 
    "\\(:[ \t\n\r\f\v]*" 
    "\\(" 
    (c-make-keywords-re nil 
    (list "sbyte" "byte" "short" "ushort" "int" "uint" "long" "ulong")) 
    "\\)" 
    "\\)?") 
    "Regex that captures an enum declaration in C#" 
) 

Ce que cela n'est défini une propriété de texte sur l'accolade ouverte après une ligne de déclaration enum. Cette propriété de texte indique à cc-mode de mettre différemment le contenu de la liste des accolades. Comme une "liste de protection". La définition de cette propriété obtient brace-list-open sur la ligne suivante.

Peut-être que quelque chose de similaire fonctionnera pour vous.

Vous pouvez personnaliser vous-même les coupleurs pour java, avec quelque chose comme ça, et si vous ouvrez un bug, vous pouvez le soumettre comme solution suggérée.

En C#, les enums peuvent dériver de n'importe quel type entier. donc,

public enum MyEnumType : uint 
{ 
    ONE = 1, 
    TWO, 
    THREE, 
} 

Je pense que dans Java il n'y a pas une telle possibilité. Si c'est le cas, l'expression rationnelle Java serait beaucoup plus simple que l'expression rationnelle que j'ai utilisée pour C#.


Oups! Il me vient à l'esprit qu'avec la syntaxe simplifiée de Java, il est également possible que vous puissiez activer les listes d'accolades, simplement en définissant le mot-clé enum dans la bonne constante de langue. Si tel est le cas, alors la solution pour vous pourrait être aussi simple que:

(c-lang-defconst c-inexpr-brace-list-kwds 
    java '("enum")) 

Cela ne fonctionne pas pour C# en raison de sa syntaxe plus complexe.


EDIT - pas qui ne fonctionne pas. C'est plus compliqué que ça.

1

La version CVS du mode CC contient en effet les correctifs nécessaires, comme Nathaniel Flath l'a mentionné plus haut. C'est facile d'installer. Il suffit de vérifier à partir de here (disons, dans ~/.emacs.d/cc-mode), byte-compile, comme expliqué dans readme, et ajouter au chemin de chargement en ajoutant (add-to-list 'load-path' ~/.emacs.d/cc-mode ") à votre ~/.emacs.d/init.el. Alors l'indentation enum fonctionne comme un charme!