फ़ाइल रिश्तेदार एस्किल निष्पादन योग्य के साथ फ्लाईचेक


21

बहुत सारी परियोजनाएँ जो मैं एस्लेंट को देव निर्भरता के रूप में स्थापित करता हूं, एस्लिंट प्लगइन्स के कस्टम सेट के साथ। अभी, फ्लाईकैच प्रत्येक प्रोजेक्ट के साथ स्थापित एस्लिंट के संस्करण के बजाय एसेलिंट के विश्व स्तर पर स्थापित संस्करण का उपयोग करता है।

मैं इसके बजाय उड़न-खट्टी को नोड_मॉड्यूल्स / एस्लिंट / बिन / एस्लिंट.जेएस बनाना चाहता हूं। पूर्ण पथ को वर्तमान बफ़र फ़ाइल के पथ पर निर्भर होना चाहिए, इसलिए मैं एक ही समय में कई प्रोजेक्ट्स पर काम कर सकता हूं और प्रत्येक बफर के साथ संभावित अलग-अलग एस्लेंट निष्पादन योग्य का उपयोग कर सकता हूं।

क्या यह संभव है? मैं यह करने के बारे में कैसे जाना होगा के लिए कोई सुझाव?

जवाबों:


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बफ़र की डायरेक्टरी के किसी भी अभिभावक की डायरेक्टरी की तलाश करता है और फ़्लाइचेक को किसी भी मौजूद होने पर उस डाइरेक्टरी से एग्ज़िल्ट निष्पादन योग्य का उपयोग करने के लिए कॉन्फ़िगर करता है।


काश मेरे ईमैक-फू ये अच्छे होते। जवाब के लिए धन्यवाद!
pcardune

1
यदि आपके पास ग्लोबल-फ्लाइचेक-मोड सेट है, तो मैं सलाह देता हूं कि (and eslint (file-executable-p eslint)) मैं त्रुटियों का सामना कर रहा था, अन्यथा मेरे
.emacs

अगर आपको इनलाइन हुक की जरूरत है (और कस्टम फ़ंक्शन जोड़ने से बचें): emacs-fu.blogspot.in/2008/12/hooks.html
Shivek Khurana

सुरक्षा नोट: केवल विश्वसनीय फ़ोल्डरों / परियोजनाओं में खुली फाइलें; यदि आप ऑटो-निष्पादित करेंगे किसी भी malicions eslint द्विआधारी
maxy

2
मैं पथ का उपयोग करूंगा "node_modules/.bin/eslint", बस अगर एस्केंट कभी अपनी निर्देशिका संरचना को बदलता है।
कोडी रीचर्ट

3

मेरे पास स्वीकृत समाधान पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है। लेकिन मैंने इसका एक रूपांतर किया, जो नेस्टेड पैकेज (उदाहरण के लिए लर्न का उपयोग करके ) के साथ अच्छी तरह से काम करता है । यह ठीक उसी कोड है, हालांकि यह बाइनरी node_modulesको खोजने तक अभिभावक फ़ोल्डर को पुन: देखता है 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

मैं खिड़कियों पर हूँ और यह मेरे लिए काम नहीं कर रहा था, मुझे लगता है कि फ़ाइल-निष्पादन योग्य-पी या शायद फ्लाईचेक इंटर्नल सही फ़ाइल का पता लगाने में विफल रहे थे। जैसे कि इसका काम करते समय यह .cmdफ़ाइल की ओर इशारा करता है न कि .jsफ़ाइल की ओर।

मुझे फ्लाईकैच-एस्लिंट में एक टिप्पणी मिली कि जावास्क्रिप्ट प्रोजेक्ट में स्थापित एस्लिंट के संस्करण और उनके बजाय निर्देशिका चर का उपयोग करने के लिए उनके ब्लॉग पोस्ट का उपयोग नहीं किया गया है।

प्रोजेक्ट की रूट डायरेक्टरी में एक फाइल बनाते हैं .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

यहाँ एक समाधान है जो परियोजना की मूल निर्देशिका में फ़ाइल का उपयोग करके Bae's और 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जावास्क्रिप्ट फ़ाइलों को संपादित करने के लिए एमएसीएस प्रमुख मोड का उपयोग कर रहे हैं । अगर ऐसा नहीं है, तो उस लाइन को उसके अनुसार बदल दें। फ़ाइल की दूसरी पंक्ति javascript-eslintसिंटैक्स चेकर को केवल इस परियोजना के भीतर उपयोग करने के लिए बनाती है। तीसरी पंक्ति चर flycheck-javascript-eslint-executableको सेट करती है <root-dir>/node_modules/.bin/eslint। इस तरह हम emacs को संशोधित नहीं करते हैं exec-path


0

मैंने इसके कुछ अलग-अलग रूपांतरों की कोशिश की है और कभी भी वैसा नहीं पाया जैसा मैं चाहता था। मैं आखिरकार Emacs लिस्प में पर्याप्त स्तर तक ले गया हूं ताकि इसे अपनी पसंद के अनुसार संशोधित कर सकूं। मेरा संस्करण स्थानीय एस्लेंट के लिए क्या देखता है और यदि कोई नहीं मिला है तो यह विश्व स्तर पर स्थापित एक पर वापस आता है:

(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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.