我在scala-mode下的Emacs中有以下代码(来自Scala 2.8包):
object t1 {
def main (args: List[String]) = {
println("Hello")
}
}
我的返回键设置为newline-and-indent
。当我在最后一个括号后反复点击返回时,它会转到最左边的一列空行。当我再次按回车时,缩进两个空格。然后它停留在这个缩进处。显然它不应该这样做。
然而,当我通过M-x反复运行newline-and-indent
并输入newline-and-indent
时,我没有得到两个空格的缩进。 reindent-then-newline-and-indent
也是如此。
为什么会出现这种差异?
答案 0 :(得分:5)
你的问题源于你将enter
反弹到newline-and-indent
,这在使用scala-mode
时似乎不是惯用的。 newline-and-indent
最终调用indent-according-to-mode
,检查一些不受欢迎的设置,必要时可以解决它们,如果一切正常,最后调用indent-line-function
,这是一个缓冲区局部变量。< / p>
由于这是特定于模式的,因此模式定义了自己的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)
和缩进检查正确的缩进相应
我不是百分之百,但乍一看这似乎正在发生。