Исправить нежелательное поведение табуляции EMACS в ESS / Stata - PullRequest
8 голосов
/ 09 ноября 2011

Режим ESS / Stata в emacs неправильно выравнивает строки, следующие за строками, заканчивающимися в операторах.Кажется, что эти строки неправильно интерпретируются как многострочные команды.

Например:

gen foo = 1

/* generate another variable */
  gen bar = 1

Строка "gen bar = 1" не должна иметь отступ.Похоже, что EMACS интерпретирует завершающий слеш в комментарии как оператор и считает, что эта строка кода занимает две строки.

Фактически, многострочные команды в stata имеют 3 завершающих слеша, а новые строки без 3 завершающих слеш указываютконец заявления.например, следующий отступ будет правильным:

gen bar = 1
gen ///
  foo = 1

Могу ли я что-нибудь добавить в мой .emacs, чтобы исправить это поведение?Я не хочу полностью отказываться от автоматического табуляции - он работает очень хорошо для всего, кроме комментариев, которые / * выглядят так * /.

Спасибо,

Pnj

1 Ответ

5 голосов
/ 16 ноября 2011

Вы правы, ESS интерпретирует завершающий / как указание на продолжение строки. Это жестко запрограммировано в функции ess-continued-statement-p, поэтому для изменения поведения необходимо переписать код. Следующий код (в вашем .emacs) работает для ваших примеров.

(eval-after-load 'ess-mode
  '(defun ess-continued-statement-p ()
   "this is modified code"
     (let ((eol (point)))
       (save-excursion
         (cond ((memq (preceding-char) '(nil ?\, ?\; ?\} ?\{ ?\]))
                nil)
               ;; ((bolp))
               ((= (preceding-char) ?\))
                (forward-sexp -2)
                (looking-at "if\\b[ \t]*(\\|function\\b[ \t]*(\\|for\\b[ \t]*(\\|while\\b[ \t]*("))
               ((progn (forward-sexp -1)
                       (and (looking-at "else\\b\\|repeat\\b")
                            (not (looking-at "else\\s_\\|repeat\\s_"))))
                (skip-chars-backward " \t")
                (or (bolp)
                    (= (preceding-char) ?\;)))
               (t
                (progn (goto-char eol)
                       (skip-chars-backward " \t")
                       (or (and (> (current-column) 1)
                                (save-excursion (backward-char 1)

        ;;;; Modified code starts here: ;;;;
                                                (or (looking-at "[-:+*><=]")
                                                    (and (looking-at "/")
                                                         (save-excursion (backward-char 1)
                                                                         (not (looking-at "*")))))))
        ;;;; End of modified code ;;;;

                           (and (> (current-column) 3)
                                (progn (backward-char 3)
                                       (looking-at "%[^ \t]%")))))))))))
...