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