【问题标题】:Emacs enum indentationEmacs 枚举缩进
【发布时间】:2010-04-30 18:34:49
【问题描述】:

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 缩进样式。有谁知道可能是什么问题?

【问题讨论】:

    标签: java emacs enums indentation


    【解决方案1】:

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

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

    【讨论】:

    • 通过 Emacs 发送的错误。我猜我们会看看会发生什么。
    • 是的,令人惊奇的是,emacs 对 Java 的支持刚刚停止,什么,2003 年?
    • 实际上,我一直在研究 java 支持 - 我刚刚完成(我认为)一切,因此应该很快将其检查为 CC 模式。这是它修复的问题之一。
    • @Nathaniel Flath:有什么消息吗?
    【解决方案2】:

    直到上周,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#"
      )
    

    它的作用是在枚举声明行之后的大括号打开上设置一个文本属性。该文本属性告诉 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#,因为它的语法更复杂。


    编辑 - 不,那没有用。比这更复杂。

    【讨论】:

      【解决方案3】:

      CC 模式的 CVS 版本确实包含必要的修复,正如 Nathaniel Flath 之前提到的。它很容易安装。只需从here 中检查它(比如说,进入 ~/.emacs.d/cc-mode),按照自述文件中的说明进行字节编译,然后通过添加 (add-to-list 'load-路径“~/.emacs.d/cc-mode”)到你的~/.emacs.d/init.el。然后枚举缩进就像一个魅力!

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 最新的 JDEE 版本不仅不正确地缩进枚举,而且实际上缩进了枚举的右括号,缩进程度与缩进不良的成员相同。
        • 这并不让我感到惊讶。然而,我对马拉巴尔的希望要大得多。
        猜你喜欢
        • 2011-09-23
        • 2018-09-27
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多