Перезавантаження локальних змінних каталогів


27

Як ви перезавантажуєте локальні змінні? Я хотів би змінити .dir-locals.elта застосувати такі зміни до поточного сеансу Emacs.


3
Локальні змінні каталогів не застосовуються до сеансу - вони застосовуються до кожного буфера, пов'язаного з файлом у цьому каталозі. Отже, одним із підходів, якщо ви добре будете повертати відкриті буфери, було б просто повернути їх усі, пробігши їх buffer-list.
Прадхан

@ Прадхан: Хоча я б скоріше застосував більш прямий підхід, ваша пропозиція спрацювала. Спасибі.
Олена

3
@Pradhan Я помилявся: повернення буфера не працює, якщо локальні змінні не були зареєстровані як безпечні.
Олена

Відповіді:


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, додаючи 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, а потім валідайте (org-режим за замовчуванням), потім введіть демо 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

Потім поверніться до буфера OR-режиму та перевірте, чи не визначена демо-змінна ( C-h C-v demo)

Тут ви можете використовувати фокус: M-: (hack-dir-local-variables-non-file-buffer)

Тепер C-h C-v demoнадрукуємо:

значення демо - "це демонстрація" Місцеве в буфері poub.org; глобально нікчемний

Значення цієї змінної є локальним для каталогу, встановленим файлом
'/home/picaud/Temp/.dir-locals.el'.

Документація: не задокументована як змінна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.