Emacs枚举缩进

时间:2010-04-30 18:34:50

标签: java emacs enums indentation

我遇到了Emacs缩进Java枚举的问题。虽然它缩进第一个成员OK,但是它希望给所有其余的静态枚举成员一个额外的缩进级别。它看起来像这样:

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 个答案:

答案 0 :(得分:4)

问题是Emacs不支持1.5或更高版本中添加的Java语言功能。例如,你也会遇到泛型问题。

编辑:令人惊讶的是,在Google上搜索“java enum site:debbugs.gnu.org”没有结果。我建议提交一个错误。

答案 1 :(得分:1)

直到上周,csharp-mode存在同样的问题。我修复它的方法是在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#"
  )

这样做是在枚举声明行之后在大括号上设置文本属性。该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#不起作用,因为它的语法更复杂。


编辑 - 没有那不起作用。它比那更复杂。

答案 2 :(得分:1)

CC模式的CVS版本确实包含必要的修复,正如Nathaniel Flath先前提到的那样。它易于安装。只需从here(例如,进入〜/ .emacs.d / cc-mode),字节编译中查看,如自述文件中所述,并通过添加(add-to-list'添加到加载路径)加载路径“〜/ .emacs.d / cc-mode”)到〜/ .emacs.d / init.el。然后enum缩进就像一个魅力!

答案 3 :(得分:0)

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