Emacs Enum Indentation - PullRequest
       13

Emacs Enum Indentation

4 голосов
/ 30 апреля 2010

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

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 Когда я запускаю его на первом члене enum, это дает мне ((defun-block-intro 21)), что определенно не правильно. Каждый последующий участник дает (statement-cont 50).

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

Ответы [ 4 ]

4 голосов
/ 30 апреля 2010

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

РЕДАКТИРОВАТЬ: Удивительно, но поиск Google для "java enum site: debbugs.gnu.org" не дает результатов. Я предлагаю оставить сообщение об ошибке.

1 голос
/ 22 января 2011

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

1 голос
/ 01 мая 2010

Та же проблема существовала в режиме 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#"
  )

Для этого устанавливается текстовое свойство на открытой скобке после строки объявления enum. Это свойство текста сообщает 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 # из-за более сложного синтаксиса.


РЕДАКТИРОВАТЬ - нет, это не сработало. Это сложнее, чем это.

0 голосов
/ 30 апреля 2010

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

...