直到上週,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