Ответ 1
Поведение, которое вы хотите изменить, жестко закодировано в функцию под названием js--proper-indentation
. Неэлегантное исправление вашей проблемы заключается в замене функции в вашем .emacs:
(require 'cl)
(eval-after-load "js" '(defun js--proper-indentation (parse-status)
"Return the proper indentation for the current line."
(save-excursion
(back-to-indentation)
(cond ((nth 4 parse-status)
(js--get-c-offset 'c (nth 8 parse-status)))
((nth 8 parse-status) 0) ; inside string
((js--ctrl-statement-indentation))
((eq (char-after) ?#) 0)
((save-excursion (js--beginning-of-macro)) 4)
((nth 1 parse-status)
;; A single closing paren/bracket should be indented at the
;; same level as the opening statement. Same goes for
;; "case" and "default".
(let ((same-indent-p (looking-at
"[]})]\\|\\_<case\\_>\\|\\_<default\\_>"))
(continued-expr-p (js--continued-expression-p)))
(goto-char (nth 1 parse-status)) ; go to the opening char
(if (looking-at "[({[]\\s-*\\(/[/*]\\|$\\)")
(progn ; nothing following the opening paren/bracket
(skip-syntax-backward " ")
(when (eq (char-before) ?\)) (backward-list))
(back-to-indentation)
(cond (same-indent-p
(current-column))
(continued-expr-p
(+ (current-column) (* 2 js-indent-level)
js-expr-indent-offset))
(t
(+ (current-column) js-indent-level
(case (char-after (nth 1 parse-status))
(?\( js-paren-indent-offset)
(?\[ js-square-indent-offset)
(?\{ js-curly-indent-offset))))))
;; If there is something following the opening
;; paren/bracket, everything else should be indented at
;; the same level.
;; Modified code here:
(unless same-indent-p
(move-beginning-of-line 1)
(forward-char 4))
;; End modified code
(current-column))))
((js--continued-expression-p)
(+ js-indent-level js-expr-indent-offset))
(t 0)))) )
Я изменил три строки кода в нижней части функции. Если вы хотите, чтобы ваш отступ составлял 8 символов вместо 4, измените строку (forward-char 4)
соответственно.
Обратите внимание, что для js--proper-indentation
(и библиотеки js) требуется библиотека cl.el, но при использовании eval-after-load
mucks this. Поэтому вам нужно явно потребовать cl
в вашем .emacs, чтобы это работало.
Обратите внимание, что это "решение" жестко кодирует 4-сегментный отступ только для указанной вами ситуации и вообще не обрабатывает вложенный код. Но зная, что точка в коде, который имеет дело с вашей ситуацией, должен по крайней мере указывать на бит, который нуждается в работе для более сложного решения.