【问题标题】:Emacs JS mode for npm stylenpm 风格的 Emacs JS 模式
【发布时间】:2011-09-02 22:45:51
【问题描述】:

emacs 有 JS 模式和npm style 非常兼容吗?

到目前为止,我正在对 js2-mode 进行修改,其中本机预期功能被覆盖并替换为“tab key = 2 个空格”。但是让我的编辑器能够像这样处理缩进会很好:

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

事实上,js2-mode 尽最大努力正确缩进并在可能的位置之间循环,但例如“逗号在 r 下排列”不是选项之一。当然,在 emacs 中写出体面的缩进代码是很困难的,而且我的 elisp 也达不到标准。

请注意,如果有人知道另一个更适合此的编辑器,我可以愿意切换。

【问题讨论】:

    标签: javascript emacs npm


    【解决方案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
                        }
                      )
    

    我认为这就是你想要的,但在我看来它仍然完全破碎。无论如何,我就是这样做的。

    将此条件注入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))))
             ....
    

    请务必保留该定义中的其余条件 - 我不知道它们的作用,但它们可能很重要。

    不知道这是否可靠,除了您的一个测试用例外,我还没有测试过它。但这应该让你开始。

    【讨论】:

    • 是的,人们经常通过在 Espresso (js-mode) 中加入缩进来增强 js2-mode。但 Espresso 正是我想要解决的问题。
    • 回复:编辑谢谢,这很有帮助。我将不得不做一些测试并回到这个问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        相关资源
        最近更新 更多