是否有针对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不适合在那里使用。
请注意,如果有人知道另一个编辑器可以更好地工作,我可以接受切换。
答案 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让你开始。