2010-09-01 10 views
5

Ich habe den folgenden Code in Emacs unter scala-Modus (von der Scala 2.8 Paket):Emacs scala-Modus Newline-and-indent Seltsamkeit

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

ich meinen Return-Taste auch newline-and-indent gesetzt haben. Wenn ich nach der letzten geschweiften Klammer wiederholt auf "Return" klicke, wird die linke Spalte für eine Leerzeile angezeigt. Wenn ich wieder zurück drücke, gibt es Einrückungen zwei Leerzeichen. Dann bleibt es bei dieser Vertiefung. Offensichtlich sollte es das nicht tun.

Wenn ich jedoch wiederholt newline-and-indent von der M-x ausführen und newline-and-indent eingeben, bekomme ich die Zwei-Raum-Einrückung nicht. Das gleiche gilt für reindent-then-newline-and-indent.

Warum gibt es diesen Unterschied?

Antwort

5

Ihr Problem rührt von der Tatsache her, dass Sie enter auf newline-and-indent zurückprallen, was bei Verwendung von scala-mode nicht idiomatisch zu sein scheint. newline-and-indent endet mit dem Aufruf indent-according-to-mode, die für einige unerwünschte Einstellungen überprüft, um sie herum funktioniert, wenn nötig, und wenn alles in Ordnung ist, ruft am Ende indent-line-function, die eine Puffer lokale Variable ist.

Da dies modusspezifisch ist, definieren Modi ihre eigenen indent-line-function. Die meisten haben ziemlich konsistentes Verhalten, aber Scala Funktion ist scala-indent-line, hier zu sehen:

(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)))) 

Das Komische daran ist, dass es wiederholt Anrufe und Einzüge erkennt ferner über jede Zeit. Bei Verwendung von M-x ist last-command nicht scala-indent-line, sondern execute-extended-command. Wenn Sie also M-x verwenden, wird die Einrückung auf der korrekten Einrückebene fortgesetzt. Wenn es jedoch an einen Schlüssel gebunden ist, merkt es, dass es unmittelbar zuvor ausgeführt wurde, und fügt einen zusätzlichen Level hinzu.

Der Effekt ist nicht kumulativ ... Ich denke, das liegt an dem ungeraden Befehlssatz am Ende der Funktion, der zuerst die Zeile einrückt, dann aber mit (scala-indentation) und Einrückungen nach dem richtigen Einzug sucht.

Ich bin nicht 100% darauf, aber auf den ersten Blick scheint das so zu sein.

+2

Na dann die Lösung, es nicht in diesen Code-Pfad zu lassen. Die folgenden Werke: (local-Set-Taste [Return] (Lambda() (interaktiv) (setq letzten Befehl nil) (Newline-and-indent))))) – qrest