Emacs中的Scala模式缩进

时间:2012-01-20 17:13:55

标签: scala emacs indentation auto-indent

在Emacs中编写Scala代码时,我注意到以下缩进问题:

List(1,2,3).foreach{ x =>

然后按回车。

然后关闭括号,这就是最终发生的事情:

List(1,2,3).foreach{ x =>
                  }

虽然这是一个特殊示例,但在Emacs中自动缩进时,此问题会以多种方式出现。

对这两个问题中任何一个问题的回答将不胜感激:

  1. 如何解决这个问题,以便将支架放在适当的位置,并且支架内的任何东西都向右缩进一级?

  2. 是否可以禁用此类型的自动缩进(即类似于vi中的“set noautoindent”)。我尝试了类似于此处建议的解决方案:Disable auto indent globally in Emacs但没有成功。

  3. 提前致谢!

2 个答案:

答案 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