Отступ в режиме Scala в Emacs - PullRequest
5 голосов
/ 20 января 2012

При написании кода Scala в Emacs я замечаю следующую проблему с отступами:

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

Затем нажмите ввод.

Затем закройте скобку, и вот что в итоге происходит:

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

Хотя это один конкретный пример, эта проблема возникает различными способами при автоматическом отступе в Emacs.

Ответ на любой из этих двух вопросов был бы признателен:

  1. Как можно решить эту проблему, чтобы скобка была помещена в нужное место и что-либо внутри скоб было смещено на один уровень вправо?

  2. Можно ли отключить этот тип автоиндентирования (например, «set noautoindent» в vi). Я пробовал решения, подобные предложенным здесь: Безуспешно отключить автозамену в Emacs .

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 31 января 2012

Я кодировал простой кусок кода - он заставляет 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)

Также добавьте строку (require 'besi) в начало scala-mode.el.

Загрузил ее на github для удобства - Беси

2 голосов
/ 21 января 2012

I попытался решить эту проблему, отредактировав файл scala-mode-indent.el.В некоторых других ситуациях он нарушает отступ, но по крайней мере у вас не будет всех этих отступов вперед на полэкран.

Закомментируйте эту строку:

;; (scala-indentation-from-following)

И измените отступ в скале-из предыдущего:

(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
...