Đang tải lại các biến thư mục-cục bộ


27

Làm thế nào để bạn tải lại các biến thư mục-cục bộ? Tôi muốn sửa đổi một .dir-locals.elvà áp dụng những thay đổi như vậy cho phiên Emacs hiện tại.


3
Các biến thư mục-cục bộ không áp dụng cho phiên - chúng áp dụng cho mọi bộ đệm liên quan đến một tệp trong thư mục đó. Vì vậy, một cách tiếp cận, nếu bạn ổn với việc hoàn nguyên bộ đệm đang mở, sẽ chỉ đơn giản là hoàn nguyên tất cả chúng, bằng cách chạy qua buffer-list.
Pradhan

@Pradhan: Mặc dù tôi muốn sử dụng một cách tiếp cận trực tiếp hơn, đề xuất của bạn đã có hiệu quả. Cảm ơn.
Elena

3
@Pradhan Tôi đã sai: hoàn nguyên bộ đệm không hoạt động, trừ khi các biến cục bộ đã được đăng ký là an toàn.
Elena

Câu trả lời:


21

Hàm này sẽ đọc lại tệp dir-locals và đặt các giá trị mới cho bộ đệm hiện tại:

(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)))

Và nếu bạn muốn tải lại thư mục cục bộ cho mọi bộ đệm trong thư mục bộ đệm hiện tại của bạn:

(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)))))

Bạn có thể có tất cả các thư mục cục bộ làm mới mỗi khi bạn lưu tệp thư mục cục bộ bằng cách thêm after-save-hookbộ đệm vào .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))))

Tất nhiên điều này có thể có những hậu quả không lường trước được vì nó sẽ đặt lại các giá trị biến bất kể chúng có bị thay đổi ở nơi khác hay không, vì vậy hãy tự chịu rủi ro khi sử dụng.


5
Tôi gần như cảm thấy như thế này nên được tích hợp vào Emacs.
PythonNut

3

Bạn cũng có thể dùng: M-: (hack-dir-local-variables-non-file-buffer)


Để kiểm tra nó hoạt động : từ bộ đệm (ví dụ: tệp chế độ org), nhập M-x add-dir-local-variable, sau đó xác thực (chế độ org mặc định), sau đó nhập RET demo, sau đó "đây là RET demo".

Tệp .dir-locals.el của bạn sẽ xuất hiện trong bộ đệm:

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

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

Bạn phải lưu nó: C-x C-s

Sau đó quay lại bộ đệm chế độ org của bạn và kiểm tra xem biến demo không được xác định ( C-h C-v demo)

Tại đây bạn có thể sử dụng mẹo: M-: (hack-dir-local-variables-non-file-buffer)

Bây giờ C-h C-v demosẽ in:

giá trị của bản demo là "đây là bản demo" Local in buffer poub.org; khoảng trống toàn cầu

Giá trị của biến này là thư mục cục bộ, được đặt bởi tệp
'/home/picaud/Temp/.dir-locals.el'.

Tài liệu: Không được ghi nhận dưới dạng một biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.