我遇到了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样式。有谁知道问题可能是什么?
答案 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中的最后一次提交(从前一天开始)有以下消息 - “修复枚举常量缩进”: - )