Та же проблема существовала в режиме 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 # из-за более сложного синтаксиса.
РЕДАКТИРОВАТЬ - нет, это не сработало. Это сложнее, чем это.