2010-04-30 92 views
4

我遇到了Emacs Java枚举缩进的问题。虽然它会缩进第一个成员,但它想要为其他所有静态枚举成员提供额外的缩进级别。它看起来像这样:Emacs枚举缩进

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不支持1.5或更高版本中添加的Java语言功能。例如,您也会遇到泛型问题。

编辑:令人惊讶的是,在谷歌搜索“java枚举网站:debbugs.gnu.org”没有给出任何结果。我建议提交一个错误。

+0

通过Emacs发送的错误。我猜会发生什么事情。 – Masterofpsi 2010-04-30 21:10:39

+0

是的,对于Java的emacs支持刚刚停止在2003年,什么也不例外呢? – Cheeso 2010-05-01 14:49:57

+0

我一直在研究java的支持,实际上 - 我刚刚完成了(我认为)所有的事情,所以它应该尽快检查到CC模式。这是它修复的问题之一。 – 2010-05-02 17:52:11

0

您可以尝试使用JDEE - 我听说他们计划包含一些Java 6支持。或者如果你更冒险,你可以尝试malabar-mode,它声称是比JDEE更好的java模式。有趣的是,malabar中的最后一次提交(从一天前)有以下消息 - “Fix enum constant indentation”:-)

+0

JDEE的最新版本不仅不正确地枚举枚举,而且实际上将枚举的关闭大括号缩进为相同级别的严重缩进成员。 – Masterofpsi 2010-05-01 05:07:59

+0

这并不让我感到惊讶。然而,我对malabar的希望更大。 – 2010-05-01 09:02:37

1

直到上周,csharp模式中存在相同的问题。我修正它的方法是在csharp语言的c-basic-matchers-after设置中添加一个新的匹配器。新的匹配是这样的:

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

这样做是设置支架打开后枚举报关行文本属性。该文本属性告诉cc-mode以不同的方式缩进括号列表的内容。作为“支架列表”。设置该属性在以下行上获得brace-list-open

也许类似的东西会为你工作。

你可以自己定制java的匹配器,就像这样,如果你打开一个bug,你可以提交这个建议的修复。

在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#的工作,因为它更复杂的语法。


编辑 - 没有,没有工作。比这更复杂。

1

CC模式的CVS版本确实包含必要的修复,正如Nathaniel Flath先前提到的那样。它很容易安装。请从here(假设,进入〜/ .emacs.d/cc模式),byte-compile(如自述文件中所述)中检查出来,并通过添加(add-to-list'load-path“ 〜/ .emacs.d/cc-mode“)到你的〜/ .emacs.d/init.el。然后枚举缩进就像一个魅力!