11

我在 Win32 上使用 GNU Emacs。

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

我有 jslint,即 WScript 版本。

4

4 回答 4

9

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

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

这个 .el 包:

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

十分简单。仍然只有 Windows。

出于历史利益的原因,我保留了此答案的所有旧部分,但您无需进一步阅读。


注意- 下面我描述了如何修改 jslint.js 以在 emacs 中使用。
如果你不想自己做,需要的已经修改的代码是可用的
该链接有一个附加部分,flymake-for-jslint-for-wsh.el,它允许您在 Windows 上将 jslint 与 flymake 一起使用。


要在 emacs 中使用 jslint,

下载jslint.js,WScript 版本

编辑 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 中调用 jslint.js,使用M-x compile. 第二个允许您使用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

替代文字

于 2010-03-17T20:58:07.880 回答
1

JSLint 不再支持 WSH。我刚刚向 EmacsWiki 添加了关于在 Windows 上使用 Node.js 设置 JSLint 的说明。

更新

Flymake 可能更好的替代品是 Flycheck,为此我还在EmacsWiki 上提供了有关如何使用 JSLint 进行设置的说明。

脚步

  1. 安装Node.js

  2. 为 Node.js 安装 jslint 包:

    C:\>npm -g install jslint
    

    在 Windows 上,从 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 文件进行测试。

    在 Windows XP/SP3 上的 Emacs 23 中运行的 flymake-jslint 的屏幕截图

故障排除

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

  • 检查flymake-jslint-args

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

于 2013-09-13T13:25:00.190 回答
0

关于我使用Perl、jslint、cygwin、EmacsW32设置的一些注意事项。真是一团糟!

于 2010-03-18T13:39:20.250 回答
0

如果您使用与 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)))))
于 2016-02-21T12:20:08.407 回答