โหลดซ้ำตัวแปรไดเรกทอรีท้องถิ่น


27

คุณจะโหลดตัวแปรไดเรกทอรีท้องถิ่นได้อย่างไร ฉันต้องการแก้ไข.dir-locals.elและมีการเปลี่ยนแปลงดังกล่าวกับเซสชัน Emacs ปัจจุบัน


3
ตัวแปรไดเรกทอรีท้องถิ่นไม่ได้ใช้กับเซสชันซึ่งจะใช้กับทุกบัฟเฟอร์ที่เกี่ยวข้องกับไฟล์ในไดเรกทอรีนั้น buffer-listดังนั้นวิธีการหนึ่งถ้าคุณจะปรับกับการคืนค่าบัฟเฟอร์เปิดของคุณจะเป็นเพียงแค่ย้อนกลับทั้งหมดของพวกเขาโดยการทำงานผ่าน
Pradhan

@Phanhan: แม้ว่าฉันอยากจะใช้วิธีการโดยตรงมากขึ้นข้อเสนอแนะของคุณทำงาน ขอบคุณ
Elena

3
@Phanhan ฉันผิด: การคืนค่าบัฟเฟอร์ไม่ทำงานยกเว้นว่าตัวแปรโลคัลได้รับการลงทะเบียนว่าปลอดภัย
Elena

คำตอบ:


21

ฟังก์ชั่นนี้จะอ่านไฟล์ dir-locals อีกครั้งและตั้งค่าใหม่สำหรับบัฟเฟอร์ปัจจุบัน:

(defun my-reload-dir-locals-for-current-buffer ()
  "reload dir locals for the current buffer"
  (interactive)
  (let ((enable-local-variables :all))
    (hack-dir-local-variables-non-file-buffer)))

และถ้าคุณต้องการโหลด dir-locals สำหรับทุกบัฟเฟอร์ในไดเรกทอรีบัฟเฟอร์ปัจจุบันของคุณ:

(defun my-reload-dir-locals-for-all-buffer-in-this-directory ()
  "For every buffer with the same `default-directory` as the 
current buffer's, reload dir-locals."
  (interactive)
  (let ((dir default-directory))
    (dolist (buffer (buffer-list))
      (with-current-buffer buffer
        (when (equal default-directory dir))
        (my-reload-dir-locals-for-current-buffer)))))

คุณสามารถให้ dir locals รีเฟรชทุกครั้งที่คุณบันทึกไฟล์ dir-locals โดยการเพิ่มafter-save-hookบัฟเฟอร์. dir-locals.el

(add-hook 'emacs-lisp-mode-hook
          (defun enable-autoreload-for-dir-locals ()
            (when (and (buffer-file-name)
                       (equal dir-locals-file
                              (file-name-nondirectory (buffer-file-name))))
              (add-hook (make-variable-buffer-local 'after-save-hook)
                        'my-reload-dir-locals-for-all-buffer-in-this-directory))))

ของหลักสูตรนี้อาจมีผลที่ไม่ตั้งใจเพราะมันจะรีเซ็ตค่าตัวแปรโดยไม่คำนึงว่าพวกเขามีการเปลี่ยนแปลงที่อื่นดังนั้นใช้ความเสี่ยงของคุณเอง


5
ฉันเกือบจะรู้สึกว่าสิ่งนี้ควรถูกสร้างขึ้นใน Emacs
PythonNut

3

คุณยังสามารถใช้: M-: (hack-dir-local-variables-non-file-buffer)


ในการตรวจสอบการทำงาน : จากบัฟเฟอร์ (เช่นไฟล์โหมด org) ให้พิมพ์M-x add-dir-local-variableจากนั้นตรวจสอบความถูกต้อง (โหมดองค์กรเริ่มต้น) จากนั้นพิมพ์ demo RET จากนั้น "นี่คือตัวอย่าง" RET

ไฟล์. dir-locals.elของคุณจะปรากฏในบัฟเฟอร์:

;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")

((org-mode
  (demo . "this is a demo")))

คุณต้องบันทึก: C-x C-s

จากนั้นกลับไปที่บัฟเฟอร์โหมดองค์กรของคุณและตรวจสอบว่าไม่ได้กำหนดตัวแปรสาธิต ( C-h C-v demo)

ที่นี่คุณสามารถใช้เคล็ดลับ: M-: (hack-dir-local-variables-non-file-buffer)

ตอนนี้C-h C-v demoจะพิมพ์:

ค่าของตัวอย่างคือ "นี่คือตัวอย่าง" Local in buffer poub.org; เป็นโมฆะทั่วโลก

ค่าของตัวแปรนี้เป็นไดเรกทอรีท้องถิ่นกำหนดโดยไฟล์
'/home/picaud/Temp/.dir-locals.el'

เอกสารประกอบ: ไม่มีเอกสารเป็นตัวแปร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.