Emacs scala-mode newline-and-indent - PullRequest
       4

Emacs scala-mode newline-and-indent

5 голосов
/ 01 сентября 2010

У меня есть следующий код в Emacs в режиме scala-mode (из пакета Scala 2.8):

object t1 {
  def main (args: List[String]) = {
    println("Hello")
  }
}

У меня также установлен ключ возврата на newline-and-indent.Когда я несколько раз нажимаю клавишу возврата после последней фигурной скобки, она переходит к крайнему левому столбцу для одной пустой строки.Когда я снова нажимаю клавишу возврата, это отступ два пробела.Затем он остается в этом отступе после этого.Очевидно, он не должен этого делать.

Однако, когда я несколько раз запускаю newline-and-indent с помощью Mx и набираю newline-and-indent, я не получаю отступ в два пробела.То же самое касается reindent-then-newline-and-indent.

Почему существует эта разница?

1 Ответ

5 голосов
/ 01 сентября 2010

Ваша проблема проистекает из того факта, что вы восстанавливаете enter до newline-and-indent, что не кажется идиоматичным при использовании scala-mode.newline-and-indent завершает вызов indent-according-to-mode, который проверяет некоторые нежелательные настройки, обходит их при необходимости, и, если все в порядке, завершает вызов indent-line-function, который является локальной переменной буфера.

Так какэто зависит от режима, режимы определяют свои indent-line-function.Большинство из них имеют довольно последовательное поведение, но функция Scala - scala-indent-line, которую можно увидеть здесь:

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

Самое смешное в этом то, что он обнаруживает повторяющиеся вызовы и отступы в дальнейшем каждый раз.При использовании Mx last-command - это не scala-indent-line, а execute-extended-command.Таким образом, при использовании Mx он продолжает отступ на правильном уровне отступа.Однако, когда он привязан к ключу, он замечает, что он был выполнен немедленно ранее, и добавляет дополнительный уровень.

Эффект не кумулятивный ... Я думаю, что это из-за нечетной команды, установленной в концефункция, которая изначально выравнивает строку, но затем проверяет правильность отступа с помощью (scala-indentation) и отступов соответственно.

Я не на 100% в этом, но на первый взгляд кажется, что это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...