【问题标题】:How can I run jslint as a javascript compile tool in emacs for Windows?如何在 Windows 的 emacs 中将 jslint 作为 javascript 编译工具运行?
【发布时间】:2023-10-30 22:35:01
【问题描述】:

我在 Win32 上使用 GNU Emacs。

我希望能够将 jslint 作为对 .js 文件的编译运行,然后逐步检查 jslint 报告的错误。

我有 jslint,WScript 版本。

【问题讨论】:

    标签: javascript emacs jslint


    【解决方案1】:

    编辑 - 现在有一个简化的模块可以为您执行此操作。

    http://marmalade-repo.org/packages/fly-jshint-wsh

    这个 .el 包:

    • 为您下载 jshint 或 jslint(可配置)
    • 应用我在下面描述的必要的 WSH 友好修改
    • 将修改后的结果保存到临时文件中
    • 在 js 模式缓冲区中通过 flymake 调用该脚本

    简单易懂。仍然只有 Windows。

    出于历史利益的原因,我保留了此答案的所有旧部分,但您不需要 继续阅读。


    注意 - 下面我将描述如何修改 jslint.js 以在 emacs 中使用。
    如果你不想自己做,already-modified code required is available.
    该链接还有一个附加部分 flymake-for-jslint-for-wsh.el,它允许您在 Windows 上将 jslint 与 flymake 一起使用。


    要在 emacs 中使用 jslint,

    下载jslint.js, the WScript version

    编辑 jslint.js 文件。滚动到底部,找到这个:

     (function(){if(!JSLINT(WScript.StdIn.ReadAll(),.....
    

    用这个替换它(以及后面的所有内容):

    (function(){
        var filename = "stdin";
        var content= "";
        if (WScript.Arguments.length > 0){
            filename = WScript.Arguments(0);
            var fso = new ActiveXObject("Scripting.FileSystemObject");
            //var file = fso.GetFile(filename);
            var fs = fso.OpenTextFile(filename, 1);
            content = fs.ReadAll();
            fs.Close();
            fso = null;
            fs = null;
        } else {
            content = WScript.StdIn.ReadAll();
        }
        if(!JSLINT(content,{passfail:false})){
            WScript.StdErr.WriteLine("JSLINT");
            for (var i=0; i<JSLINT.errors.length; i++) {
                // sample error msg:
                //  sprintf.js(53,42) JSLINT: Use the array literal notation [].
                var e=JSLINT.errors[i];
                if (e !== null){
                    var line = (typeof e.line == "undefined")?'0':e.line;
                    WScript.StdErr.WriteLine(filename + '(' +line+','+e.character+') JSLINT: '+e.reason);
                    WScript.StdErr.WriteLine('    ' + (e.evidence||'').replace(/^\s*(\S*(\s+\S+)*)\s*$/,"$1"));
                }
            }}}());
    

    此更改有两件事:

    1. 允许您在命令行上指定要运行 lint 的文件,而不是作为标准输入。如果根本没有指定文件,标准输入仍然有效。
    2. 以更类似于大多数 C/C++ 编译器的格式发出错误消息。

    第一个更改允许您在 emacs 中使用 M-x compile 调用 jslint.js。第二个允许您使用M-x next-error 解释错误消息。

    将该文件保存到 jslint-for-wsh.js

    然后,在您的 init.el 或 emacs.el 中,将这个正则表达式添加到您的 compilation-error-regexp-alist

     ;; JSLINT
     ("^[ \t]*\\([A-Za-z.0-9_: \\-]+\\)(\\([0-9]+\\)[,]\\( *[0-9]+\\))\\( Microsoft JScript runtime error\\| JSLINT\\): \\(.+\\)$" 1 2 3)
    

    在您的 javascript 模式挂钩中,设置编译命令:

      (setq compile-command
           (let ((file (file-name-nondirectory buffer-file-name)))
             (concat "%windir%\\system32\\cscript.exe \\LOCATION\\OF\\jslint-for-wsh.js "  file)))
    

    就是这样。


    当您打开一个 .js 文件并运行 M-x compile 时,您将在现有缓冲区上运行 jslint.js。你会得到一个错误列表,M-x next-error 会按照你的预期工作。

    耶!!

    您还可以在 Linux 或 Windows 上将 jslint 作为 flymake 语法检查器工具运行。 详情请见http://www.emacswiki.org/emacs/FlymakeJavaScript

    【讨论】:

      【解决方案2】:

      JSLint 不再支持 WSH。我刚刚在 EmacsWiki 中添加了 instructions 在 Windows 上使用 Node.js 设置 JSLint。

      更新

      可能比 flymake 更好的替代品是 Flycheck,我还为此提供了 instructions on EmacsWiki 关于如何使用 JSLint 进行设置的信息。

      步骤

      1. 安装Node.js

      2. 为 Node.js 安装 jslint 包:

        C:\>npm -g install jslint
        

        在 Windows 上,an issue 从 EMACS 23 调用 jslint。因此,创建一个 包装器~/.emacs.d/jslint.bat (jslint 需要是文件名的一部分!):

        @ECHO OFF
        node "%APPDATA%"\npm\node_modules\jslint\bin\jslint.js >"%TEMP%"\jslint.out 2>&1 %*
        TYPE "%TEMP%"\jslint.out
        
      3. 从 Emacs 的内置 shell EShell 测试 JSLint:

        $ ~/.emacs.d/jslint.bat
        No files specified.
        [...]
        
      4. 安装flymake-jslint及其依赖flymake-easy

      5. 添加到~/.emacs:

        (require 'flymake-jslint)
        (add-hook 'js-mode-hook 'flymake-jslint-load)
        
      6. 自定义flymake-jslint-command:~/.emacs.d/jslint.bat

      7. 可选择自定义其他 flymake-jslint 选项。

      8. 重新启动 Emacs 以确保一切正常。

      9. 通过打开有缺陷的 JavaScript 文件进行测试。

      疑难解答

      • 自定义flymake-log-level 并检查*Messages* 缓冲区。

      • 检查flymake-jslint-args

      • 确保flymake-jslint-command中配置的命令在EShell中运行。

      【讨论】:

        【解决方案3】:

        关于我使用 Perl, jslint, cygwin, EmacsW32. 的设置的一些注释真是一团糟!

        【讨论】:

          【解决方案4】:

          如果您使用与 Node.js 一起安装的 JSHint,例如,您可以运行

          M-x compile jshint --reporter unix --verbose *.js.

          或者,添加到您的 .emacs 文件中:

          (add-hook 'js-mode-hook
              (lambda() (setq compile-command
                  (concat "jshint --reporter unix --verbose "
                          (file-name-nondirectory buffer-file-name)))))
          

          【讨论】:

            最近更新 更多