फ़ाइल पथों को .dir-locals.el में उपनिर्देशिकाओं के लिए मैप कैसे किया जाता है?


10

मुझे इसका विचार पसंद है .dir-locals.el.dir-locals.elमेरी होम निर्देशिका में मेरी अपनी फ़ाइल है जो निर्देशिकाओं / फ़ाइलों के लिए सभी चर सेट करना चाहिए जो मैं तब तक खोलता हूं जब तक .dir-locals.elकि निर्देशिका में मैं फ़ाइल को खोलने के करीब न हो। खोली गई फ़ाइलों पर लागू किया गया।

यह मेरा है ~/.dir-locals.el:

(("dev/school" .
  ((indent-tabs-mode . nil)
   (c-basic-offset . 4)))
 ("dev/test" .
  ((indent-tabs-mode . nil)
   (c-basic-offset . 4)))
 (c-mode .
  ((c-file-style . "linux")
   (c-basic-offset . 8))))

जब मैं फ़ाइल खोलता हूं ~/dev/test/test.cतो चर indent-tabs-modeसेट हो जाता है tऔर c-basic-offsetहोता है 8

(describe-variable 'c-basic-offset)उस फ़ाइल मुझसे कहता है इसे करने के लिए सेट कर दिया जाता 8से ~/.dir-locals.el

(describe-variable 'indent-tabs-mode)उस फ़ाइल में कहा गया है कि यह मूल्य ( t) अपनी डिफ़ॉल्ट स्थिति में है।

क्या मैं किसी तरह वांछित व्यवहार प्राप्त कर सकता हूं? मैं क्या गलत कर रहा हूं? फ़ाइल पथों को उपनिर्देशिकाओं में मैप कैसे किया जाता है ~/.dir-locals.el?

संपादित करें:

जैसा कि जोनाथन ने सुझाव दिया , मैंने भी कोशिश की:

(;; dev/school subdir
 ("dev/school" .
  ;; dev/school specification for all modes
  (nil . ((indent-tabs-mode . nil)
          (c-basic-offset . 4)))))

और यहां तक ​​कि क्या add-dir-local-variableजोड़ा:

(("dev/school"
  (indent-tabs-mode)
  (c-basic-offset . 4)))

दुर्भाग्य से, उनमें से कोई भी काम नहीं करता है।

जवाबों:


7

मैनुअल में प्रलेखन के आधार पर , आप उप-विनिर्देश विनिर्देश के एक हिस्से को याद कर रहे हैं।

नमूना .dir-locals.el

जोर / स्पष्टीकरण के लिए टिप्पणियों के साथ मैनुअल से

(;; Dir settings
 (nil . ((indent-tabs-mode . t)
         (fill-column . 80)))
 (c-mode . ((c-file-style . "BSD")
            (subdirs . nil)))
 ;; Subdir specification
 ("src/imported" .
  ;; Subdir settings
  ((nil . ((change-log-default-name
            . "ChangeLog.local"))))))

सही किया गया है। dir-locals.el

यह इस धारणा पर आधारित है कि आप subdirविनिर्देशों को सभी मोड पर लागू करना चाहते हैं। आप केवल चाहते हैं उन्हें लागू करने के लिए c-modeबदलने के nilसाथ c-modeमोड विनिर्देश में।

(;; dev/school subdir
 ("dev/school" .
  ;; dev/school specification for all modes
  ((nil . ((indent-tabs-mode . nil)
           (c-basic-offset . 4)))))
 ;; dev/test subdir
 ("dev/test" .
  ;; dev/test specification for all modes
  ((nil . ((indent-tabs-mode . nil)
           (c-basic-offset . 4)))))
 ;; c-mode specification for dir + subdirs
 (c-mode .
  ((c-file-style . "linux")
   (c-basic-offset . 8))))

मैंने डॉक्यूमेंटेशन में उस उदाहरण को गलत समझा, जो स्पष्ट करने के लिए धन्यवाद। हालाँकि, मैंने आपके संस्करण की कोशिश की (कॉपी-पेस्ट) और यह अभी भी उसी तरह का व्यवहार करता है। यहां तक ​​कि 'emacs -Q' के साथ भी। डिबगिंग के सुझावों का भी स्वागत किया जाता है।
nert

मैंने भी प्रयोग करने की कोशिश की add-dir-local-variableऔर ~/.dir-locals.elप्रश्न में उपयोग किए जाने की तुलना में इसे और भी छोटे वाक्यविन्यास के साथ जोड़ा गया ("dev/test" (indent-tabs-mode)):। अभी भी काम नहीं करता है, यद्यपि।
nert

मुझे लगता है कि मेरा संस्करण कुछ पराने को याद कर रहा था, मैंने उन्हें (नमूना की तुलना में इसे देखते हुए) जोड़ा है और सबडिअर स्पेक्स के आसपास अतिरिक्त होने चाहिए थे("dev/test" . ((spec1 ...) (spec2 ...) ...))
जोनाथन लीच-पेपिन

हाँ, वह काम करता है! अब केवल समस्या यह है कि मोड चर निर्देशिकाओं पर पूर्वता लेते हैं, लेकिन चूंकि वे केवल सी-मोड से संबंधित हैं, इसलिए मैं इनिट के दौरान उन्हें सेट-डिफॉल्ट के साथ सेट कर सकता हूं। आपका बहुत बहुत धन्यवाद।
nert

1
वह अजीब है। मैंने आज एक परीक्षण ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))किया और यह ठीक से काम किया (स्थानीय संस्करण को शून्य पर सेट करने के लिए प्रेरित किया गया)। हो सकता है कि सूची के भीतर उप-निर्देशिका विशिष्टताओं के ऊपर रूट को डालने की कोशिश करें, यह संभव है कि इसे अंतिम मान पर सेट किया जाए।
जोनाथन लीच-पेपिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.