首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于npm风格的Emacs JS模式

用于npm风格的Emacs JS模式
EN

Stack Overflow用户
提问于 2011-05-27 04:53:43
回答 3查看 1.7K关注 0票数 6

有没有一个与npm style非常兼容的emacs的JS模式?

到目前为止,我正在使用js2-mode的一个修改,其中原生功能被覆盖,并被替换为“Tab键=2个空格”。但如果我的编辑器能够像这样处理缩进,那就太好了:

代码语言:javascript
复制
var o = { foo : 'bar'
        , baz : 'foo'
        }
  , p
  , q = new Squash( o
                  , { start: 0
                    , limit: 50
                    }
                  )

实际上,js2-mode会尽量正确地缩进,并在可能的位置之间循环,但例如“在r下排列的逗号”不在选项之列。当然,在emacs中编写像样的缩进代码是很困难的,我的elisp也达不到要求。

请注意,如果有人知道另一个编辑器可以更好地处理这一点,我可能会对切换持开放态度。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-27 12:13:38

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

代码语言:javascript
复制
var o = { foo : 'bar'
          , baz : 'foo'
        }
, p
, q = new Squash( o
                  , { start: 0
                      , limit: 50
                    }
                )

我想这不是你想要的。逗号的偏移量可能与您喜欢的不同。

(天哪,这太难看了。)

编辑

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

它针对不同的语法模式测试了一堆条件。我刚刚检查了以逗号开头的行,得到了以下结果:

代码语言:javascript
复制
var o = { foo : 'bar'
        , baz : 'foo'
        }
  , p
  , q = new Squash( o
                  , { start: 0
                    , limit: 50
                    }
                  )

我想这就是你想要的,但在我看来它还是完全坏了。不管怎么说,这就是我是怎么做的。

将此条件插入到js--proper-indentation列表的顶部:

代码语言:javascript
复制
(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))))
         ....

一定要把剩下的条件放在去有趣的地方--我不知道它们是做什么的,但它们可能很重要。

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

票数 1
EN

Stack Overflow用户

发布于 2011-06-03 05:20:41

多亏了Cheeso的建议,这里有一个组合模式,它以浓缩咖啡的方式处理逗号优先或逗号结尾样式的缩进,同时使用js2-mode:https://github.com/thomblake/js-mode的强大解析和错误检查。

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

编辑:现在可以在https://github.com/thomblake/js3-mode上找到,名为js3-

票数 5
EN

Stack Overflow用户

发布于 2011-05-29 07:18:04

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6144930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档