2012-01-20 5 views
5

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

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

затем нажмите клавишу ВВОД.

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

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

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

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

  1. Как эта проблема может быть установлена ​​так, что распорка получает положить в нужном месте и все, что в фигурных скобках с отступом на один уровень к правильно?

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

Заранее благодарен!

ответ

2

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

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

;; (scala-indentation-from-following) 

И изменить SCALA отступы-из-предшествующее:

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

Как я уже говорил, он все еще остается сломана после этого. Я планирую написать лучшую поддержку в ближайшее время, может быть, через неделю или две.

EDIT:

Если вы хотите отключить SCALA отступы полностью, закомментируйте строку в mode.el-лестницу

;; indent-line-function   'scala-indent-line 
+0

Спасибо так много Рогач! Пожалуйста, дайте мне знать, если вы добавите дополнительную поддержку. – nequitans

+0

@nequitans - добро пожаловать! Я добавлю еще один ответ на этот вопрос, когда закончим. – Rogach

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

Редактировать линия-mode.el лестницу

indent-line-function   'besi-indent-line 

и линии в режиме-лестницу-ui.el

("\r"      'besi-newline) 

добавить также линию (require 'besi) начала mode.el-лестницу ,

Прислал его GitHub для удобства - besi

+0

Если у вас есть предложения/комментарии, пожалуйста, дайте мне знать! – Rogach