2010-09-01 72 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