2010-09-01 18 views
5

tengo el siguiente código en Emacs bajo scala-modo (desde el 2,8 paquete de Scala):Emacs scala-modo de salto de línea-y-guión rareza

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

también tengo mi llave de retorno ajustado a newline-and-indent. Cuando presiono repetidamente regresar después de la última llave, va a la columna más a la izquierda para una línea en blanco. Cuando presiono regresar, es las sangrías dos espacios. Luego permanece en esta sangría a partir de entonces. Obviamente no debería hacer esto.

Sin embargo, cuando ejecuto repetidamente newline-and-indent por M-x y escribo newline-and-indent, no obtengo la sangría de dos espacios. Lo mismo vale para reindent-then-newline-and-indent.

¿Por qué hay esta diferencia?

Respuesta

5

Su problema proviene del hecho de que recupera enter en newline-and-indent, que no parece ser idiomático cuando usa scala-mode. newline-and-indent termina llamando al indent-according-to-mode, que busca algunas configuraciones no deseadas, funciona a su alrededor si es necesario, y si todo está bien, termina llamando al indent-line-function, que es una variable local de búfer.

Como esto es modo específico, los modos definen su propio indent-line-function. La mayoría tienen un comportamiento bastante consistente, pero la función de Scala es scala-indent-line, visto aquí:

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

Lo curioso de esto es que detecta las llamadas y las sangrías repetidas aún más en cada momento. Cuando se usa M-x, last-command no es scala-indent-line, es execute-extended-command. Por lo tanto, al usar M-x, continúa indentando en el nivel de sangría correcto. Sin embargo, cuando se vincula a una tecla, se da cuenta de que se ejecutó inmediatamente antes y sangra un nivel adicional.

El efecto no es acumulativo ... Creo que esto se debe al comando impar establecido al final de la función, que inicialmente sangra la línea, pero luego verifica la indentación correcta con (scala-indentation) y sangra por consiguiente.

No estoy al 100% en esto, pero a primera vista eso parece estar sucediendo.

+2

Bueno, entonces la solución es no dejarlo en la ruta del código. Las siguientes obras: (local-set-key [volver] '(lambda() (interactiva) (setq último comando nil) (nueva línea-y-guión))))) – qrest