如何在emacs for Windows中运行jslint作为javascript编译工具?

时间:2010-03-17 20:54:12

标签: javascript emacs jslint

我在Win32上使用GNU Emacs。

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

我有jslint,WScript版本。

4 个答案:

答案 0 :(得分:9)

编辑 - 现在有一个简化的模块可以帮到你。

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

这个.el包:

  • 为您下载jshint或jslint(可配置)
  • 应用我在下面描述的必要的WSH友好修改
  • 将修改后的结果保存到临时文件
  • 通过js-mode buffers中的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的文件,而不是stdin。如果根本没有指定文件,Stdin仍然有效。
  2. 以与大多数C / C ++编译器更相似的格式发出错误消息。
  3. 第一个更改允许您使用M-x compile从emacs中调用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可以按预期工作。

    alt text http://i40.tinypic.com/10nclxv.jpg

    Yipee !!

    您还可以在Linux或Windows上运行jslint作为flymake语法检查工具。 有关详细信息,请参阅http://www.emacswiki.org/emacs/FlymakeJavaScript

    alt text http://i47.tinypic.com/2mk1eh.jpg

答案 1 :(得分:1)

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

更新

Flycheck可能是flymake的一个更好的替代方案,我还提供了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文件进行测试。

    Screenshot of flymake-jslint running in Emacs 23 on Windows XP/SP3

  10. 故障排除

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

    • 检查flymake-jslint-args

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

答案 2 :(得分:0)

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

答案 3 :(得分: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)))))