有没有一个与npm style非常兼容的emacs的JS模式?
到目前为止,我正在使用js2-mode的一个修改,其中原生功能被覆盖,并被替换为“Tab键=2个空格”。但如果我的编辑器能够像这样处理缩进,那就太好了:
var o = { foo : 'bar'
, baz : 'foo'
}
, p
, q = new Squash( o
, { start: 0
, limit: 50
}
)实际上,js2-mode会尽量正确地缩进,并在可能的位置之间循环,但例如“在r下排列的逗号”不在选项之列。当然,在emacs中编写像样的缩进代码是很困难的,我的elisp也达不到要求。
请注意,如果有人知道另一个编辑器可以更好地处理这一点,我可能会对切换持开放态度。
发布于 2011-05-27 12:13:38
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
}
)我想这就是你想要的,但在我看来它还是完全坏了。不管怎么说,这就是我是怎么做的。
将此条件插入到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))))
....一定要把剩下的条件放在去有趣的地方--我不知道它们是做什么的,但它们可能很重要。
不知道这是不是健壮的,除了你的一个测试用例,我没有测试过它。但这应该能让你开始。
发布于 2011-06-03 05:20:41
多亏了Cheeso的建议,这里有一个组合模式,它以浓缩咖啡的方式处理逗号优先或逗号结尾样式的缩进,同时使用js2-mode:https://github.com/thomblake/js-mode的强大解析和错误检查。
如果遇到任何问题,请随时提交错误报告-我打算修复它们。
编辑:现在可以在https://github.com/thomblake/js3-mode上找到,名为js3-
发布于 2011-05-29 07:18:04
你应该看看the improved js2-mode fork,它似乎能够比普通模式更好地处理缩进。
https://stackoverflow.com/questions/6144930
复制相似问题