用于npm样式的Emacs JS模式

时间:2011-05-26 20:53:43

标签: javascript emacs npm

是否有针对emacs的JS模式与npm style非常兼容?

到目前为止,我正在修改js2-mode,其中包含已覆盖的原生意图功能,并替换为“tab key = 2 spaces”。但让我的编辑器能够像这样处理缩进会很好:

var o = { foo : 'bar'
        , baz : 'foo'
        }
  , p
  , q = new Squash( o
                  , { start: 0
                    , limit: 50
                    }
                  )

实际上,js2-mode会尽量正确地缩进并在可能的位置之间循环,但是例如“在r下排队的逗号”不是其中一个选项。当然,在emacs中编写体面的缩进代码很难,而且我的elisp不适合在那里使用。

请注意,如果有人知道另一个编辑器可以更好地工作,我可以接受切换。

3 个答案:

答案 0 :(得分:5)

非常感谢Cheeso的建议,这是一个有点混乱的模式组合,在使用js2-mode的强大解析和错误检查时,以espresso方式处理逗号优先或逗号最后样式的缩进: https://github.com/thomblake/js-mode

如果遇到任何问题,请随时提交错误报告 - 我打算修复它们。

编辑:现在位于https://github.com/thomblake/js3-mode,并且名为js3-mode

答案 1 :(得分:2)

你应该看看the improved js2-mode fork,它似乎能够比普通模式更好地处理缩进。

答案 2 :(得分:1)

Emacs 23.2包含js-mode,这是一个重命名和修饰的Espresso。我刚刚在你的无聊代码上做了“缩进区域”并得到了这个:

var o = { foo : 'bar'
          , baz : 'foo'
        }
, p
, q = new Squash( o
                  , { start: 0
                      , limit: 50
                    }
                )

我猜这不完全是你想要的。逗号的偏移量与您可能的偏差不同。

(天哪,这太丑了。)


修改
好的,我查看了js-mode,缩进似乎是由js--proper-indentation完成的。它查看当前行,然后尝试做出有关如何缩进的决定。

对于各种语法模式,它测试了一系列条件。我只是检查一个以逗号开头的行,并得到了这些结果:

var o = { foo : 'bar'
        , baz : 'foo'
        }
  , p
  , q = new Squash( o
                  , { start: 0
                    , limit: 50
                    }
                  )

我认为这就是你想要的,但它看起来仍然完全不合适。无论如何,这就是我做到的。

将此cond注入js--proper-indentation列表的顶部:

(defun js--proper-indentation (parse-status)
  "Return the proper indentation for the current line."
  (save-excursion
    (back-to-indentation)
    (cond
          ((looking-at ",")
           (let ((spos
                  (save-excursion
                    (while (looking-back "}[\t\n ]*")
                      (backward-sexp)
                      (if (looking-back ",[\t\n ]*")
                          (re-search-backward ",[\t\n ]*")))

                    (cond
                     ((looking-back "\\(,\\|(\\)[ \t]*\\<\\([^:=\n\t ]+\\)[ \t\n]*")
                      (re-search-backward "\\(,\\|(\\)[ \t]*\\<\\([^:=\n\t ]+\\)[ \t\n]*" (point-min) t)
                      (+ (current-column) 2))

                     ((re-search-backward "\\<\\([^:=\n\t ]+\\)[ \t]*\\(:\\|=\\)" (point-min) t)
                      (current-column))
                     (t 
                      nil)))))
             (if spos
                 (- spos 2)
               (+ js-indent-level js-expr-indent-offset))))
         ....

一定要保持其余的条件 - 我不知道他们做了什么,但可能很重要。

不知道这是否健壮,除了你的一个测试用例,我还没有测试过它。但这个oughta让你开始。