在Emacs中编写Scala代码时,我注意到以下缩进问题:
List(1,2,3).foreach{ x =>
然后按回车。
然后关闭括号,这就是最终发生的事情:
List(1,2,3).foreach{ x =>
}
虽然这是一个特殊示例,但在Emacs中自动缩进时,此问题会以多种方式出现。
对这两个问题中任何一个问题的回答将不胜感激:
如何解决这个问题,以便将支架放在适当的位置,并且支架内的任何东西都向右缩进一级?
是否可以禁用此类型的自动缩进(即类似于vi中的“set noautoindent”)。我尝试了类似于此处建议的解决方案:Disable auto indent globally in Emacs但没有成功。
提前致谢!
答案 0 :(得分:4)
我编写了一段简单的代码 - 它使得emacs在大多数时间内保持缩进级别,并且当前一个非空行以“{”,“(”,“>结尾)向右缩进两个空格;“,”=“。
将文件besi.el添加到您的加载路径。
(provide 'besi)
(defun besi-indent-line ()
"Indent current line"
(interactive)
(scala-indent-line-to (besi-indent)))
(defun besi-indent ()
(save-excursion
(forward-comment -100000)
(backward-char 1)
(if (or (looking-at "{") (looking-at "=") (looking-at ">") (looking-at "("))
(+ (current-indentation) 2)
(current-indentation))))
(defun besi-newline ()
(interactive)
(newline-and-indent))
在scala-mode.el中编辑行
indent-line-function 'besi-indent-line
和scala-mode-ui.el中的行
("\r" 'besi-newline)
还在scala-mode.el的开头添加一行(require 'besi)
。
将其上传到github以便于参考 - besi
答案 1 :(得分:2)
我尝试通过编辑scala-mode-indent.el文件来解决此问题。它在某些其他情况下会缩进缩进,但至少你不会将所有这些缩进半屏向前移动。
注释掉这一行:
;; (scala-indentation-from-following)
并修改scala-indentation-from-preceding:
(defun scala-indentation-from-preceding ()
;; Return suggested indentation based on the preceding part of the
;; current expression. Return nil if indentation cannot be guessed.
(save-excursion
(scala-backward-spaces)
(and
(not (bobp))
(if (eq (char-syntax (char-before)) ?\()
(scala-block-indentation)
(progn
(when (eq (char-before) ?\))
(backward-sexp)
(scala-backward-spaces))
t
;;(scala-looking-at-backward scala-expr-start-re)
))
(if (scala-looking-at-backward scala-expr-start-re)
(+ (current-indentation) scala-mode-indent:step)
(current-indentation)
))))
正如我所说,在此之后它仍然存在。我计划很快写下更好的支持,也许一两个星期。
编辑:
如果要完全禁用scala缩进,请在scala-mode.el中注释掉该行
;; indent-line-function 'scala-indent-line