简体   繁体   中英

Emacs problematic JavaScript indentation

I'm following the Douglas Crockford's code convention , but I can't get the correct identation in JS mode in Emacs. I tried to customize the indent options of the mode, tried another modes like js3, but nothing seems to work.

When I have parenthesis, and I have to break the expression, Emacs indent like this:

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

While the convention that I'm following, says that I should leave just 4 spaces when an expression is broken up. So the indentation should look like:

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

Any idea of how I can change the indentation on broken up expressions?

The behaviour you want to change is hard-coded into a function called js--proper-indentation . An inelegant fix to your problem would be to replace the function in your .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))))  )

I have modified three lines of code towards the bottom of the function. If you want your indentation to be 8 chars instead of 4, change the (forward-char 4) line accordingly.

Note that js--proper-indentation (and the js library) requires the cl.el library, but that using eval-after-load mucks this up. So you need to explicitly require cl in your .emacs for this to work.

Note that this 'solution' hard codes a 4 space indentation only for the situation you indicate, and does not handle nested code at all. But knowing the point in the code that deals with your situation should at least point you towards the bit that needs work for a more sophisticated solution.

你可以尝试https://github.com/mooz/js2-mode ...它是一个fork js2-mode但是有一些像压痕这样的改进...其他方式是阅读这篇文章: http://mihai.bazon。 net / projects / editing-javascript-with-emacs-js2-mode ..但真诚的是,更好的想法更换旧的js2-mode ..有几个改进https://github.com/mooz/js2-mode/wiki/从原始模式改变 ...希望这可以帮助你......

You can file a feature request on js3-mode at https://github.com/thomblake/js3-mode/issues

Do you have a link to a style guide?

BTW, while the indentation conventions vary from language to language, and the preferences can even vary between users (such as in the above case), there is a fair bit of overlap and there are often ways to write your code such that there is little disagreement. Eg your above code could be written:

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

or

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

and most indentation styles would largely agree on how to indent it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM