Answers:
您可以通过编程方式进行更改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可执行文件(如果存在)。
(and eslint (file-executable-p eslint))
遇到其他错误,例如,编辑我的.emacs文件
"node_modules/.bin/eslint"
,以防eslint曾经更改其目录结构。
我没有足够的声誉来就接受的解决方案发表评论。但是我做了一些修改,可以与嵌套包(例如使用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)
我在Windows上,这对我来说不起作用,我认为file-executable-p或flycheck内部没有找到正确的文件。当其工作时,它指向.cmd
文件而不是.js
文件。
我在flycheck-eslint中发现了一个注释,该注释未使用JavaScript项目中安装的eslint版本,并且其博客文章改用目录变量。
在项目的根目录中创建一个文件 .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
我以前的解决方案是跨不同项目工作的痛苦。
我已经修改了对硬代码窗口愚蠢的可接受答案。
(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))))
这是一个使用项目根目录(或更具体地说,是包含二进制文件所在文件夹的目录)中的文件将Bae和lunaryorn的答案组合在一起的解决方案。创建具有以下内容的文件。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
。
我已经尝试了几种不同的变体,但从未找到我想要的。我终于在Emacs lisp中进行了足够的升级,可以根据自己的喜好对其进行修改。我的版本所做的是寻找本地eslint,如果找不到,则会退回到全局安装的eslint:
(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)))