Flycheck з виконуваним файлом відносно eslint


21

Дуже багато проектів, над якими я працюю над встановленням eslint як залежної від розробки, зі спеціальним набором плагінів eslint. Зараз flycheck використовує глобально встановлену версію eslint, а не версію eslint, встановлену з кожним проектом.

Я хотів би зробити так, щоб флешек вказав на node_modules / eslint / bin / eslint.js. Повний шлях повинен залежати від шляху файлу поточного буфера, тому я можу працювати над декількома проектами одночасно з кожним буфером, використовуючи потенційно інший виконуваний файл eslint.

Чи можливо це? Будь-які пропозиції щодо того, як би я займався цим?

Відповіді:


32

Ви можете програмно змінювати flycheck-javascript-eslint-executable, наприклад

(defun my/use-eslint-from-node-modules ()
  (let* ((root (locate-dominating-file
                (or (buffer-file-name) default-directory)
                "node_modules"))
         (eslint
          (and root
               (expand-file-name "node_modules/.bin/eslint"
                                 root))))
    (when (and eslint (file-executable-p eslint))
      (setq-local flycheck-javascript-eslint-executable eslint))))

(add-hook 'flycheck-mode-hook #'my/use-eslint-from-node-modules)

Цей код шукає node_modulesкаталог у будь-якому батьківському каталозі буфера і налаштовує Flycheck використовувати виконуваний eslint з цього каталогу, якщо такий існує.


Я б хотів, щоб мої емак-фу були такими хорошими. Дякую за відповідь!
pcardune

1
Якщо у вас встановлений режим глобального мухомор, я рекомендую, щоб у (and eslint (file-executable-p eslint)) мене виникли помилки, інакше намагаючись, тобто редагувати свій .emacs файл
Jason Dufair

Ось що ви можете зробити, якщо вам потрібен вбудований гачок (і уникайте додавання спеціальних функцій): emacs-fu.blogspot.in/2008/12/hooks.html
Шивек Хурана

Примітка безпеки: лише відкриті файли в надійних папках / проектах ви автоматично виконаєте будь-які зловмисні файли eslint binary
максимум

2
Я використовував би шлях "node_modules/.bin/eslint", на випадок, якщо eslint колись змінить структуру каталогу.
Коді Райхерт

3

У мене недостатньо репутації, щоб коментувати прийняте рішення. Але я змінив його, що добре працює з вкладеними пакетами (наприклад, використовуючи lerna ). Це абсолютно той самий код, однак він шукає батьківську node_modulesпапку рекурсивно, поки не знайде eslintдвійковий код і не використовує його. Таким чином, у вас може бути, що проект lerna має лише одну конфігурацію eslint, спільну для всіх підпакетів.

(defun my/use-eslint-from-node-modules ()
  (let ((root (locate-dominating-file
               (or (buffer-file-name) default-directory)
               (lambda (dir)
                 (let ((eslint (expand-file-name "node_modules/eslint/bin/eslint.js" dir)))
                  (and eslint (file-executable-p eslint)))))))
    (when root
      (let ((eslint (expand-file-name "node_modules/eslint/bin/eslint.js" root)))
        (setq-local flycheck-javascript-eslint-executable eslint)))))
(add-hook 'flycheck-mode-hook #'my/use-eslint-from-node-modules)

0

Я в Windows, і це не працювало для мене, я думаю, що виконуваний файл-p або, можливо, внутрішні флешки не змогли знайти правильний файл. Як і коли він працює, він вказує на .cmdфайл, а не на .jsфайл.

Я знайшов коментар у flycheck-eslint не використовує версію eslint, встановлену в проекті JavaScript, а їхнє повідомлення в блозі замість цього використовує змінні каталоги .

У кореневому каталозі проекту створіть файл .dir-locals.el

((nil . ((eval . (progn
                   (add-to-list 'exec-path (concat (locate-dominating-file default-directory ".dir-locals.el") "node_modules/.bin/")))))))

Тепер, коли я відвідую файл JavaScript, я flycheck-verify-setupправильно знаходжу файл<dir>/node_modules/.bin/eslint.cmd


0

Моє попереднє рішення було болем працювати над різними проектами.

Я змінив прийняту відповідь на тупість жорсткого коду Windows.

(defun my/use-eslint-from-node-modules ()
  (let* ((root (locate-dominating-file
                (or (buffer-file-name) default-directory)
                "node_modules"))
         (eslint (and root
                      (expand-file-name "node_modules/.bin/eslint.cmd"
                                        root))))
    (when (and eslint (file-exists-p eslint))
      (setq-local flycheck-javascript-eslint-executable eslint))))

0

Ось рішення, яке поєднує Bae та Лунарінора, використовуючи dir-locals.elфайл у кореневому каталозі проекту (або, точніше, у каталозі, що містить node_modules/папку, де eslintживе бінарний файл). Створіть зазначений dir-locals.elфайл із наступним вмістом.

((js2-mode
   (flycheck-checker . javascript-eslint)
   (eval . (setq-local flycheck-javascript-eslint-executable
             (concat (locate-dominating-file default-directory
                       ".dir-locals.el") "node_modules/.bin/eslint")))))

Тут я припускаю, що ви використовуєте js2-modeосновний режим emacs для редагування файлів javascript. Якщо це не так, змініть відповідний рядок відповідно. Другий рядок файлу робить javascript-eslintперевірку синтаксису єдиним, який буде використовуватися в рамках цього проекту. Третій рядок встановлює зміннуflycheck-javascript-eslint-executable на <root-dir>/node_modules/.bin/eslint. Таким чином ми не змінюємо emacs ' exec-path.


0

Я спробував кілька різних варіацій цього і ніколи не знайшов саме того, що хотів. Нарешті я вирівнявся на Emacs lisp, щоб змінити його на свій смак. Моя версія - це пошук локальної програми, і якщо її не знайдено, вона повертається до глобально встановленої версії:

(defun configure-web-mode-flycheck-checkers ()
    ;; See if there is a node_modules directory
    (let* ((root (locate-dominating-file
                  (or (buffer-file-name) default-directory)
                  "node_modules"))
           (eslint (or (and root
                            ;; Try the locally installed eslint
                            (expand-file-name "node_modules/eslint/bin/eslint.js" root))

                       ;; Try the global installed eslint
                       (concat (string-trim (shell-command-to-string "npm config get prefix")) "/bin/eslint"))))

      (when (and eslint (file-executable-p eslint))
        (setq-local flycheck-javascript-eslint-executable eslint)))

    (if eslint
        (flycheck-select-checker 'javascript-eslint)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.