2010-04-30 71 views
4

我遇到了Emacs Java枚舉縮進的問題。雖然它會縮進第一個成員,但它想要爲其他所有靜態枚舉成員提供額外的縮進級別。它看起來像這樣:Emacs枚舉縮進

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的縮進樣式。有誰知道這個問題可能是什麼?

回答

4

問題是Emacs不支持1.5或更高版本中添加的Java語言功能。例如,您也會遇到泛型問題。

編輯:令人驚訝的是,在谷歌搜索「java枚舉網站:debbugs.gnu.org」沒有給出任何結果。我建議提交一個錯誤。

+0

通過Emacs發送的錯誤。我猜會發生什麼事情。 – Masterofpsi 2010-04-30 21:10:39

+0

是的,對於Java的emacs支持剛剛停止在2003年,什麼也不例外呢? – Cheeso 2010-05-01 14:49:57

+0

我一直在研究java的支持,實際上 - 我剛剛完成了(我認爲)所有的事情,所以它應該儘快檢查到CC模式。這是它修復的問題之一。 – 2010-05-02 17:52:11

0

您可以嘗試使用JDEE - 我聽說他們計劃包含一些Java 6支持。或者如果你更冒險,你可以嘗試malabar-mode,它聲稱是比JDEE更好的java模式。有趣的是,malabar中的最後一次提交(從一天前)有以下消息 - 「Fix enum constant indentation」:-)

+0

JDEE的最新版本不僅不正確地枚舉枚舉,而且實際上將枚舉的關閉大括號縮進爲相同級別的嚴重縮進成員。 – Masterofpsi 2010-05-01 05:07:59

+0

這並不讓我感到驚訝。然而,我對malabar的希望更大。 – 2010-05-01 09:02:37

1

直到上週,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#的工作,因爲它更復雜的語法。


編輯 - 沒有,沒有工作。比這更復雜。

1

CC模式的CVS版本確實包含必要的修復,正如Nathaniel Flath先前提到的那樣。它很容易安裝。請從here(假設,進入〜/ .emacs.d/cc模式),byte-compile(如自述文件中所述)中檢查出來,並通過添加(add-to-list'load-path「 〜/ .emacs.d/cc-mode「)到你的〜/ .emacs.d/init.el。然後枚舉縮進就像一個魅力!