Как отмечают другие, одна проблема с подходом к локальным переменным файла заключается в том, что вам нужно изменить файл, и это не идеально, если вам нужно сохранить эти объявления вне контроля версий.
Если вы хотите, чтобы переменные применялись к всем файлам в указанном каталоге, тогда локальные переменные каталога, очевидно, являются подходящим способом, и вы можете реализовать это либо с помощью файла .dir-locals.el
, либо с помощьюзвонить (dir-locals-set-directory-class)
:
Я сам предпочитаю подход с использованием каталога, и я подумал, что этоЖаль, что нет аналогичного подхода к локальным переменным файла, но я обнаружил, что код класса каталога на самом деле отлично работает с файлами, и единственная проблема заключается в том, что dir-locals-set-directory-class
вызывает file-name-as-directory
в своем аргументе, что препятствует егоиз-за обратной косой черты.
Таким образом, ниже приведен способ настройки локальных переменных каталога для одного файла без изменения самого файла.или влияет на другие файлы в том же родительском каталоге.
(defun my-file-locals-set-directory-class (file class &optional mtime)
"Enable 'directory local' classes for individual files,
by allowing non-directories in `dir-locals-directory-cache'.
Adapted from `dir-locals-set-directory-class'."
(setq file (expand-file-name file))
(unless (assq class dir-locals-class-alist)
(error "No such class `%s'" (symbol-name class)))
(push (list file class mtime) dir-locals-directory-cache))
(dir-locals-set-class-variables
'my-javascript-class
'((nil . ((js-indent-level . 2)
(indent-tabs-mode . nil)))))
(my-file-locals-set-directory-class
"path/to/the/file.js" 'my-javascript-class)