views:

206

answers:

2

I'm using GNU Emacs on Win32.

I want to be able to run jslint as a compilation on .js files, and then step through the errors that jslint reports.

I have jslint, the WScript version.

+4  A: 

Note - Below I describe how to modify jslint.js for use within emacs.
If you don't want to do it yourself, the already-modified code required is available.
That link has an additional piece, flymake-for-jslint-for-wsh.el, that allows you to use jslint with flymake, on Windows.


To use jslint within emacs,

Download jslint.js, the WScript version.

Edit the jslint.js file. Scroll to the bottom and find this:

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

Replace that (and everything that follows) with this:

(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"));
            }
        }}}());

This change does two things:

  1. allows you to specify the file to run lint on, on the command line, rather than as stdin. Stdin still works if no file is specified at all.
  2. emits the error messages in a format that is more similar to most C/C++ compilers.

The first change allows you to invoke jslint.js from within emacs with M-x compile. The second allows you to interpet error messages with M-x next-error.

Save that file to jslint-for-wsh.js

Then, in your init.el, or emacs.el, add to your compilation-error-regexp-alist, this regexp:

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

In your javascript mode hook, set the compile command:

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

That's it.


When you then open a .js file, and run M-x compile, you will run jslint.js on the existing buffer. You'll get a list of errors, and M-x next-error works as you expect.

alt text

Yipee!!

You can also run jslint as the flymake syntax checker tool, on Linux or Windows. See http://www.emacswiki.org/emacs/FlymakeJavaScript for details.

alt text

Cheeso
A: 

Some notes on my setup using Perl, jslint, cygwin, EmacsW32. What a mess!

Michael Paulukonis