พา ธ ของไฟล์ถูกแมปไปยังไดเรกทอรีย่อยอย่างไรใน. 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-offset8

(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

ฉันคิดว่ารุ่นของฉันหายไปบาง parens ฉันได้เพิ่มพวกเขาใน (ดูมันมากกว่าเมื่อเทียบกับตัวอย่างและควรจะมีคนพิเศษรอบรายละเอียดย่อย("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin

ใช่มันใช้งานได้! ปัญหาเดียวในตอนนี้ก็คือตัวแปรโหมดมีความสำคัญมากกว่าไดเร็กตอรี่ไดเร็กทอรี, แต่เนื่องจากมันเกี่ยวข้องกับ c-mode เท่านั้นฉันจึงสามารถตั้งค่ามันด้วย setq-default ระหว่าง init. ขอบคุณมาก.
nert

1
มันแปลกมาก ฉันทำการทดสอบโดยใช้วันนี้((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))และทำงานอย่างถูกต้อง (ได้รับแจ้งให้ตั้งค่า var ท้องถิ่นเป็นศูนย์) อาจลองวางรูทเหนือข้อมูลจำเพาะย่อยย่อยในรายการเป็นไปได้ที่จะตั้งค่าเป็นค่าสุดท้ายที่พบ
Jonathan Leech-Pepin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.