Flycheck พร้อมไฟล์ปฏิบัติการ eslint แบบสัมพัทธ์


21

โครงการจำนวนมากที่ฉันทำงานเกี่ยวกับการติดตั้ง eslint เป็นการพึ่งพา dev โดยใช้ชุดปลั๊กอิน eslint ที่กำหนดเอง ตอนนี้ flycheck ใช้เวอร์ชันที่ติดตั้งทั่วโลกของ eslint แทนที่จะเป็นเวอร์ชันของ eslint ที่ติดตั้งกับแต่ละโครงการ

ฉันต้องการให้คะแนน flycheck ไปที่ 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 จากไดเรกทอรีนั้นหากมีอยู่


ฉันหวังว่า emacs-fu ของฉันจะดี ขอบคุณสำหรับคำตอบ!
pcardune

1
หากคุณมีชุดทั่วโลก flycheck โหมดแล้วผมขอแนะนำให้(and eslint (file-executable-p eslint)) ผมได้พบข้อผิดพลาดมิฉะนั้นพยายามคือการแก้ไขของฉันไฟล์ .emacs
เจสัน Dufair

นี่คือสิ่งที่คุณสามารถทำได้หากคุณต้องการเบ็ดแบบอินไลน์ (และหลีกเลี่ยงการเพิ่มฟังก์ชั่นที่กำหนดเอง): emacs-fu.blogspot.in/2008/12/hooks.html
Shivek Khurana

หมายเหตุเกี่ยวกับความปลอดภัย: เปิดเฉพาะไฟล์ในโฟลเดอร์ / โครงการที่เชื่อถือได้ คุณจะอัตโนมัติดำเนินการใด ๆ malicions eslint ไบนารี
maxy

2
ฉันจะใช้เส้นทาง"node_modules/.bin/eslint"ในกรณีที่ eslint เคยเปลี่ยนแปลงโครงสร้างไดเรกทอรีของพวกเขา
Cody Reichert

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 หรือบางที flycheck internals ล้มเหลวในการค้นหาไฟล์ที่ถูกต้อง เมื่อมันทำงานมันชี้ไปที่.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/")))))))

ตอนนี้เมื่อฉันเข้าชมไฟล์จาวาสคริปต์จะค้นหาไฟล์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

นี่คือทางออกที่รวมแบ้ของและlunaryorn ของคำตอบโดยใช้dir-locals.elไฟล์ในไดเรกทอรีรากของโครงการ (หรือมากขึ้นโดยเฉพาะในไดเรกทอรีที่มีnode_modules/โฟลเดอร์ที่eslintชีวิต binary) สร้าง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-eslintตัวตรวจสอบไวยากรณ์เป็นหนึ่งเดียวที่จะใช้ภายในโครงการนี้ บรรทัดที่สามกำหนดตัวแปรเพื่อflycheck-javascript-eslint-executable <root-dir>/node_modules/.bin/eslintด้วยวิธีนี้เราไม่แก้ไข emacs'exec-path


0

ฉันลองใช้รูปแบบที่แตกต่างกันสองสามอย่างนี้และไม่เคยพบสิ่งที่ฉันต้องการ ในที่สุดฉันก็ปรับระดับเพียงพอใน Emacs เสียงกระเพื่อมเพื่อปรับเปลี่ยนตามความชอบของฉัน สิ่งที่รุ่นของฉันทำคือมองหา 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)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.