ファイル相対eslint実行可能ファイルでのフライチェック


21

私が取り組んでいる多くのプロジェクトでは、eslintプラグインのカスタムセットを使用して、eslintをdev依存関係としてインストールしています。現在、flycheckは、各プロジェクトでインストールされているeslintのバージョンではなく、eslintのグローバルにインストールされているバージョンを使用します。

代わりに、fly_checkが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は、バッファーのディレクトリの親でディレクトリを検索し、存在する場合はそのディレクトリのeslint実行可能ファイルを使用するようにFlycheckを構成します。


emacs-fuがこんなに良かったと思います。答えてくれてありがとう!
pcardune

1
global-flycheck-modeが設定されている場合は、(and eslint (file-executable-p eslint)) そうしないとエラーが発生することをお勧めします。つまり、.emacsファイルを編集します
Jason Dufair

インラインフックが必要な場合(およびカスタム関数の追加を避けるため)にできることは次のとおり
fu.blogspot.in

セキュリティに関する注意:信頼できるフォルダー/プロジェクト内のファイルのみを開いてください。マリシオンeslintバイナリを自動的に実行します
最大

2
"node_modules/.bin/eslint"eslintがディレクトリ構造を変更した場合に備えて、パスを使用します。
コーディライカート

3

受け入れられた解決策についてコメントするほどの評判はありません。しかし、ネストされたパッケージ(たとえばlernaを使用)でうまく機能するバリエーションを作成しました。これはまったく同じコードですnode_modulesが、eslintバイナリが見つかるまで親フォルダーを再帰的に検索して使用します。このようにして、lernaプロジェクトに、すべてのサブパッケージ間で共有される1つの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上にいて、これは私のために働いていませんでした、私はfile-executable-pまたはおそらくフライチェック内部が正しいファイルを見つけるのに失敗していたと思います。動作しているときは、.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


0

私の以前のソリューションは、さまざまなプロジェクトで作業するのが苦痛でした。

ハードコードウィンドウの愚かさに対する受け入れられた答えを修正しました。

(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

プロジェクトのルートディレクトリ(より具体的には、バイナリが存在するフォルダを含むディレクトリ)にあるファイルを使用して、Baelunaryornの回答を組み合わせたソリューションを次にdir-locals.el示しnode_modules/ますeslintdir-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-modeemacsメジャーモードを使用してjavascriptファイルを編集していると想定しています。そうでない場合は、それに応じてその行を変更します。ファイルの2行目は、javascript-eslintこのプロジェクト内で使用される唯一の構文チェッカーになります。3行目は、変数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)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.