Emacs scala模式换行符和缩进怪异

Emacs scala模式换行符和缩进怪异,emacs,scala,Emacs,Scala,我在scala模式下的Emacs中有以下代码(来自scala 2.8包): 我还将返回键设置为换行和缩进。当我在最后一个大括号后反复点击return时,它会转到最左边的一列,显示一个空行。当我再次按return键时,它缩进两个空格。然后,它保持在这个缩进。显然,它不应该这样做 但是,当我通过M-x重复运行换行和缩进并键入换行和缩进时,我没有得到两个空格的缩进。这同样适用于缩进,然后是换行和缩进 为什么会有这种差异?您的问题源于您将回车反弹到换行和缩进,这在使用scala模式时似乎并不惯用换行和缩

我在scala模式下的Emacs中有以下代码(来自scala 2.8包):

我还将返回键设置为
换行和缩进。当我在最后一个大括号后反复点击return时,它会转到最左边的一列,显示一个空行。当我再次按return键时,它缩进两个空格。然后,它保持在这个缩进。显然,它不应该这样做

但是,当我通过M-x重复运行
换行和缩进
并键入
换行和缩进
时,我没有得到两个空格的缩进。这同样适用于
缩进,然后是换行和缩进


为什么会有这种差异?

您的问题源于您将
回车
反弹到
换行和缩进
,这在使用
scala模式时似乎并不惯用<代码>换行和缩进
最终根据模式调用
缩进
,该模式检查一些不需要的设置,必要时可绕过这些设置,如果一切正常,则最终调用
缩进行函数
,这是一个缓冲区局部变量

由于这是特定于模式的,因此模式定义了自己的
缩进行函数
。大多数具有相当一致的行为,但Scala的函数是
Scala缩进行
,如下所示:

(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命令
不是
scala缩进行
,而是
执行扩展命令
。因此,当使用M-x时,它将继续以正确的缩进级别缩进。然而,当绑定到一个键时,它会注意到它是在之前立即执行的,并缩进一个额外的级别

效果不是累积的……我认为这是因为函数末尾设置了奇数命令,它最初缩进行,但随后使用
(scala缩进)
检查正确的缩进,并相应缩进


我并不是100%同意这一点,但乍一看,这似乎就是正在发生的事情。

那么解决方案就是不要让它进入代码路径。以下工作:(本地设置键[return]'(lambda()(交互式)(setqlast命令nil)(换行和缩进(())))
(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))))