Вопрос по javascript – Emacs проблемный JavaScript-отступ

11

Я следую заСоглашение по коду Дугласа Крокфорда, но я не могу получить правильную идентификацию в режиме JS в Emacs. Я пытался настроить параметры отступа режима, пробовал другие режимы, такие как js3, но ничего не работает.

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

this.offices.each(this.addOfficesToMap,
                  this);

Хотя соглашение, которому я следую, гласит, что я должен оставить только 4 пробела, когда выражение разбито. Таким образом, отступ должен выглядеть так:

this.offices.each(this.addOfficesToMap,
    this);

Любая идея о том, как я могу изменить отступ для разбитых выражений?

В этом вопросеstackoverflow.com/questions/344966/sane-tab-in-emacs Я получил кое-что Если я нажму M-I, я получу ожидаемую идентификацию. После нажатия C-h k справочная система сообщает мне, что выполненная команда является tab-to-tab-stop. Это то, что я хочу по умолчанию. sanbor
Я думаю, что ваше требование неверно: & quot; Когда выписка не помещается на одной строке, может возникнуть необходимость разбить ее. Поместите разрыв после оператора, в идеале после запятой. Разрыв после оператора уменьшает вероятность того, что ошибка копирования-вставки будет замаскирована вставкой точки с запятой.The next line should be indented 8 spaces. & Quot; (а не 4). phils

Ваш Ответ

4   ответа
1

https://github.com/thomblake/js3-mode/issues

У вас есть ссылка на руководство по стилю?

Error: User Rate Limit Exceededvar foo = document /n.getElementById('bar');Error: User Rate Limit Exceeded sanbor
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmanual indentation optionError: User Rate Limit ExceededDouglas Crockford's code conventionError: User Rate Limit ExceededLine length section. sanbor
Error: User Rate Limit Exceeded
1

https://github.com/mooz/js2-mode  ... это режим js2 ветвления, но с некоторыми улучшениями, такими как хорошие отступы ... другой способ - прочитать эту статью:http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode  ..но искренне лучше заменить старый js2-режим .. он имеет несколько улучшенийhttps://github.com/mooz/js2-mode/wiki/Changes-from-the-original-mode  ... надеюсь, это поможет вам ...

0

в то время как соглашения об отступах варьируются от языка к языку, и предпочтения могут даже различаться у разных пользователей (например, в приведенном выше случае), существует значительное совпадение, и часто есть способы написания вашего кода, так что мало разногласие. Например. Ваш код выше может быть написано:

this.offices.each(
    this.addOfficesToMap,
    this
);

или же

this.offices.each
    (this.addOfficesToMap,
     this);

и большинство стилей отступов в значительной степени согласились бы с тем, как сделать отступ.

Error: User Rate Limit Exceeded sanbor
5

которое вы хотите изменить, жестко запрограммировано в функцию под названием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 портит это. Так что вам нужно явно требоватьcl в вашем .emacs, чтобы это работало.

Обратите внимание, что это «решение» жестко кодирует отступ в 4 пробела только для указанной вами ситуации и вообще не обрабатывает вложенный код. Но знание смысла в коде, касающемся вашей ситуации, должно, по крайней мере, указать вам на то, что нужно для более сложного решения.

Error: User Rate Limit ExceededcaseError: User Rate Limit Exceededeval-after-loadError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded+: Symbol's function definition is void: caseError: User Rate Limit Exceeded sanbor
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded(eval-after-load "js" '(defun js-proper-indentation (parse-status)Error: User Rate Limit Exceeded sanbor
Error: User Rate Limit ExceededSymbol's function definition is void: caseError: User Rate Limit ExceededC+M+\Error: User Rate Limit Exceeded(add-hook 'js-mode-hook (lambda () (local-set-key [tab] 'tab-to-tab-stop))) sanbor

Похожие вопросы