2010-09-01 14 views
5

ho il seguente codice in Emacs in scala-mode (dal pacchetto Scala 2.8):Emacs scala-modalità newline-e-trattino stranezza

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

ho anche la mia chiave ritorno impostata newline-and-indent. Quando tocco ripetutamente return dopo l'ultima parentesi, passa alla colonna più a sinistra per una riga vuota. Quando premo di nuovo invio, è rientri due spazi. Quindi rimane in questa indentazione in seguito. Ovviamente non dovrebbe farlo.

Tuttavia, quando eseguo ripetutamente newline-and-indent da M-x e digitando newline-and-indent, non ottengo il rientro di due spazi. Lo stesso vale per reindent-then-newline-and-indent.

Perché c'è questa differenza?

risposta

5

Il problema deriva dal fatto che si rimbalza da enter a newline-and-indent, che non sembra essere idiomatico quando si utilizza scala-mode. newline-and-indent termina chiamando il numero indent-according-to-mode, che verifica alcune impostazioni indesiderate, aggirazza se necessario e, se tutto è OK, termina chiamando indent-line-function, che è una variabile locale del buffer.

Poiché questo è specifico della modalità, le modalità definiscono il proprio indent-line-function. La maggior parte hanno un comportamento piuttosto coerente, ma la funzione di Scala è scala-indent-line, visto qui:

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

La cosa divertente di questo è che rileva le chiamate ei rientri ripetuti ulteriormente nel corso di volta in volta. Quando si utilizza M-x, last-command non è scala-indent-line, è execute-extended-command. Quindi, quando si usa M-x, continua a rientrare al livello di indentazione corretto. Quando viene associato a un tasto, tuttavia, rileva che è stato eseguito immediatamente in precedenza e introduce un ulteriore livello.

L'effetto non è cumulativo ... Credo che questo sia a causa del comando dispari impostare al termine della funzione, che fa rientrare inizialmente la linea, ma poi i controlli per la corretta indentazione con (scala-indentation) e rientri di conseguenza.

Non sono al 100% su questo, ma a prima vista è quello che sembra andare avanti.

+2

Bene, allora la soluzione è quella di non lasciarlo in quel percorso di codice. Le seguenti opere: (locale-set-key [ritorno] '(lambda() (interattivo) (setq ultimo comando nullo) (newline-e-trattino))))) – qrest