2010-04-30 5 views
4

У меня проблема с вложением Emacs из перечислений Java. Хотя он отступает от первого члена ОК, он хочет предоставить всем остальным членам статического члена перечисления дополнительный уровень отступов. Это выглядит следующим образом:Emacs enum indentation

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

Когда я бегу C-c C-s на линии, которая открывает перечисление, это дает мне ((inclass 1) (topmost-intro 1)), который, кажется, не совсем правильно - похоже, она должна давать brace-list-open. Когда я запускаю его в первом члене перечисления, он дает мне ((defun-block-intro 21)), что определенно не так. Каждый последующий член дает (statement-cont 50).

Я в java-режиме, и я использую java-стиль отступов. Кто-нибудь знает, в чем проблема?

ответ

4

Проблема заключается в том, что Emacs не поддерживает функции языка Java, добавленные в версии 1.5 или более поздней. Например, у вас также будут проблемы с дженериками.

EDIT: Удивительно, что поиск Google для сайта java enum: debbugs.gnu.org не дает никаких результатов. Я предлагаю подать ошибку.

+0

Ошибка, отправленная через Emacs. Мы посмотрим, что произойдет, я думаю. – Masterofpsi

+0

Да, это также удивительно, что поддержка emacs для Java просто остановилась, что, 2003? – Cheeso

+0

Я работал над поддержкой java, на самом деле - я только что закончил (думаю) все, поэтому его нужно проверить в режиме CC довольно скоро. Это одна из проблем, которые она исправила. –

0

Вы можете попробовать использовать JDEE - Я слышал, что они планировали включить поддержку Java 6. Или, если вы более предприимчивы, вы можете попробовать malabar-mode, который утверждает, что это лучший режим Java, чем JDEE. Забавно, что последнее коммит в malabar (с дня назад) имеет следующее сообщение: «Fix enum constant indentation» :-)

+0

Последнее отношение JDEE не только отступы перечислены неправильно, но на самом деле отступы закрывающей скобки enum на том же уровне, что и сильно отступы. – Masterofpsi

+0

Это меня не удивляет. Мои надежды на малабар, однако, намного больше. –

1

Та же проблема существовала в режиме csharp до последней недели. То, как я исправил это, было добавить новый матчи в настройке c-basic-matchers-after для языка csharp. Новый согласовани выглядит следующим образом:

;; 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 определяется как

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

Что это установлено текстовое свойство на скобка открыть после перечисления декларации строки. Это свойство text указывает cc-mode на то, чтобы поместить содержимое списка скобок по-разному. Как «список скобок». Установка этого свойства получает brace-list-open в следующей строке.

Возможно, что-то подобное сработает для вас.

Вы можете настроить помощники для java самостоятельно, с чем-то подобным, и если вы откроете ошибку, вы можете отправить это как рекомендуемое исправление.

В C# перечисления могут быть получены из любого целочисленного типа. так,

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

Я думаю, что в Java нет такой возможности. Если это так, регулярное выражение Java будет намного проще, чем регулярное выражение, которое я использовал для C#.


Огонь! Мне просто пришло в голову, что с более простым синтаксисом Java существует также возможность включить скобки-списки, просто установив ключевое слово enum в нужную константу языка. Если это так, то для вас решение может быть столь же просто, как:

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

Это не работает для C# из-за его более сложного синтаксиса.


EDIT - нет, что не работает. Это сложнее, чем это.

1

CVS-версия CC-mode действительно содержит необходимые исправления, как упоминалось ранее Натаниэль Флат. Он прост в установке. Просто проверьте его с here (скажем, в ~/.emacs.d/cc-mode), byte-compile, как описано в readme, и добавьте путь загрузки путем добавления (add-to-list 'load-path " ~/.emacs.d/cc-mode ") на ваш ~/.emacs.d/init.el. Тогда перечисление перечисления работает как шарм!