Emacs中的Scala模式缩进

5
写Scala代码时在Emacs中,我注意到以下缩进问题:
List(1,2,3).foreach{ x =>

然后按回车键。

接着关闭括号,这样就会发生以下情况:

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

尽管这只是一个例子,但在Emacs中自动缩进时,这个问题以多种方式出现。
非常感谢回答以下两个问题中的任何一个:
1. 如何修复此问题,使大括号放置在正确的位置,并且大括号内的内容向右缩进一级? 2. 是否可能禁用此类自动缩进(例如在vi中使用'set noautoindent'),我尝试了像在此处建议的解决方案但没有成功。
提前致谢!
2个回答

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中的and行

("\r"                       'besi-newline)

在scala-mode.el文件的开头添加一行(require 'besi)

为了方便参考,将其上传到github - besi


如果您有任何建议或意见,请告诉我! - Rogach

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

非常感谢您,Rogach!如果您添加更多支持,请务必告诉我。 - nequitans
@nequitans - 不用谢!等我完成后,我会为这个问题添加另一个答案。 - Rogach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接