2010-09-01 54 views
5

我在Emacs下面的代碼下階模式(從斯卡拉2.8軟件包):Emacs的斯卡拉模式換行符和縮進怪事

object t1 { 
    def main (args: List[String]) = { 
    println("Hello") 
    } 
} 

我也有我的返回鍵設置爲newline-and-indent。當我在最後一個大括號之後反覆打回時,它會到最左邊的一列空白行。當我再次按回車時,它縮進兩個空格。然後它在此後停留在此縮進處。顯然它不應該這樣做。

但是,當我反覆運行newline-and-indent的M-x和打字newline-and-indent,我沒有得到雙空間縮進。 reindent-then-newline-and-indent也是如此。

爲什麼會有這種差異?

回答

5

您的問題源於您將enter重新彈回newline-and-indent的事實,這在使用scala-mode時似乎並不習慣。 newline-and-indent最終呼叫indent-according-to-mode,它檢查一些不需要的設置,必要時在它們周圍工作,如果一切正常,最後調用indent-line-function,這是一個緩衝區局部變量。

由於這是模式特定的,所以模式定義了它們自己的indent-line-function。多數有相當一致的行爲,但Scala的功能是scala-indent-line,在這裏看到:

(defun scala-indent-line() 
    "Indent current line as smartly as possible. 
When called repeatedly, indent each time one stop further on the right." 
    (interactive) 
    (if (or (eq last-command this-command) 
      (eq last-command 'scala-undent-line)) 
     (scala-indent-line-to (+ (current-indentation) scala-mode-indent:step)) 
    (let 
    ((indentation (scala-indentation))) 
     (scala-indent-line-to indentation)))) 

關於這個有趣的是,它檢測到重複調用,並進一步縮進,每次過來。當使用M-x時,last-command不是scala-indent-line,它是execute-extended-command。所以,當使用M-x時,它會繼續縮進正確的縮進級別。然而,綁定到一個密鑰時,它會注意到它之前立即執行並縮進一個額外的級別。

效果不是累積性的......我認爲這是因爲函數末尾設置了奇怪的命令,最初會縮進該行,但隨後會根據(scala-indentation)和縮進來檢查正確的縮進。

我不是100%在這個,但乍一看,這似乎是怎麼回事。

+2

那麼解決方案是不讓它進入代碼路徑。以下作品: (本地設置鍵[返回]「(拉姆達() (互動) (setq最後命令無) (新行和縮進))))) – qrest 2010-09-02 16:18:28