Emacs JS模式适用于npm风格

6

是否有一个与npm风格相当兼容的emacs JS模式?

到目前为止,我正在使用js2-mode的修改版本,其中本地意图功能被覆盖并替换为“制表符= 2个空格”。但如果我的编辑器能够处理像这样的缩进,那将是很好的:

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

作为现有的功能,js2-mode会尽其所能正确缩进代码,并在可能的位置之间循环切换。但是例如“逗号对齐”不是其中的选项之一。当然,在emacs中编写良好的缩进代码很困难,我的elisp水平也不够高。请注意,如果有人知道其他编辑器可以更好地实现这一点,我可以考虑切换。
3个回答

5
感谢Cheeso的建议,这是一个有点混合在一起的模式组合,可以处理espresso方式中逗号前或逗号后样式的缩进,同时使用js2-mode的出色解析和错误检查:https://github.com/thomblake/js-mode 如果遇到任何问题,请随时提交错误报告 - 我打算修复它们。
编辑:现在可以在https://github.com/thomblake/js3-mode找到,名为js3-mode。

2

1
Emacs 23.2 中包含了 js-mode,这是一个重命名和改进过的 Espresso。我刚刚在你那可笑的代码上执行了 "indent-region",得到了这个:
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))))
         ....

一定要保留defun中的其他条件 - 我不知道它们的作用,但它们可能很重要。

我不确定这是否牢固可靠,除了您的一个测试用例外,我没有进行过其他测试。但这应该可以帮助您入门。


是的,人们经常通过包含 Espresso(js-mode)的缩进来增强 js2-mode。但是 Espresso 正好是我试图解决的问题。 - Tamzin Blake
回复:编辑 谢谢,非常有帮助。我需要进行一些测试并回到这个问题。 - Tamzin Blake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接