Подтвердить что ты не робот

Как запустить jslint как инструмент компиляции javascript в emacs для Windows?

Я использую GNU Emacs на Win32.

Я хочу иметь возможность запускать jslint как компиляцию в .js файлах, а затем выполнять ошибки, которые сообщают jslint.

У меня есть jslint, версия WScript.

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ - Там теперь упрощенный модуль, который делает это для вас.

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

Этот .el пакет:

  • загружает jshint или jslint для вас (настраивается)
  • применяет необходимые WSH-дружественные модификации, которые я опишу ниже
  • сохраняет измененный результат во временный файл
  • вызывает этот скрипт через flymake в буферах js-mode

Очень просто. Тем не менее Windows только.

Я сохранил все старые части этого ответа по причинам исторического интереса, но вам не нужно читать дальше.


Примечание. Ниже я опишу, как изменить jslint.js для использования в emacs.
Если вы не хотите делать это самостоятельно, доступен уже измененный код.
Эта ссылка содержит дополнительную часть, flymake-for-jslint-for-wsh.el, которая позволяет вам использовать jslint с flymake в Windows.


Чтобы использовать jslint в Emacs,

Загрузите 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 в командной строке, а не как stdin. Stdin все еще работает, если файл не указан вообще.
  2. выдает сообщения об ошибках в формате, который больше похож на большинство компиляторов C/C++.

Первое изменение позволяет вам вызывать jslint.js из Emacs с помощью Mx compile. Второе позволяет вам интерпретировать сообщения об ошибках с помощью Mx 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 установите команду compile:

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

Это.


Когда вы затем откроете файл .js и запустите Mx compile, вы запустите jslint.js в существующем буфере. Вы получите список ошибок, и Mx next-error работает, как вы ожидаете.

alt text

Yipee !!

Вы также можете запустить jslint как средство проверки синтаксиса flymake в Linux или Windows. См. Http://www.emacswiki.org/emacs/FlymakeJavaScript для деталей.

alt text

Ответ 2

JSLint больше не поддерживает WSH. Я добавил инструкции в EmacsWiki для настройка JSLint с помощью Node.js в Windows.

Update

Возможно, лучшей альтернативой flymake является Flycheck, для которого я также предоставил инструкции по EmacsWiki относительно того, как настроить его с помощью JSLint.

Действия

  • Установите Node.js.

  • Установите пакет jslint для Node.js:

    C:\>npm -g install jslint
    

    В Windows есть проблема с вызовом jslint из EMACS 23. Таким образом, создайте wrapper ~/.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
    
  • Тестирование JSLint из Emacs, встроенного в оболочку EShell:

    $ ~/.emacs.d/jslint.bat
    No files specified.
    [...]
    
  • Установите flymake-jslint и его зависимость flymake-easy.

  • Добавить в ~/.emacs:

    (require 'flymake-jslint)
    (add-hook 'js-mode-hook 'flymake-jslint-load)
    
  • Настроить flymake-jslint-command: ~/.emacs.d/jslint.bat

  • Можно настроить другие параметры flymake-jslint.

  • Перезапустите Emacs, чтобы убедиться, что все загружается нормально.

  • Протестируйте, открыв неверный файл JavaScript.

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

Устранение неполадок

  • Настроить flymake-log-level и проверить буфер *Messages*.

  • Проверьте flymake-jslint-args.

  • Убедитесь, что команда, настроенная в flymake-jslint-command, запускается в EShell.

Ответ 3

Некоторые заметки о моей настройке с использованием Perl, jslint, cygwin, EmacsW32. Какой беспорядок!

Ответ 4

Если вы используете JSHint, установленный с Node.js, вы можете, например, запустить

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)))))