直到上周,csharp模式中存在相同的问题。我修正它的方法是在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的匹配器,就像这样,如果你打开一个bug,你可以提交这个建议的修复。
在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#的工作,因为它更复杂的语法。
编辑 - 没有,没有工作。比这更复杂。
通过Emacs发送的错误。我猜会发生什么事情。 – Masterofpsi 2010-04-30 21:10:39
是的,对于Java的emacs支持刚刚停止在2003年,什么也不例外呢? – Cheeso 2010-05-01 14:49:57
我一直在研究java的支持,实际上 - 我刚刚完成了(我认为)所有的事情,所以它应该尽快检查到CC模式。这是它修复的问题之一。 – 2010-05-02 17:52:11