dir-locals
Название файла: .dir-locals.el
- https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html
- https://www.gnu.org/software/emacs/manual/html_node/elisp/Directory-Local-Variables.html
- https://www.emacswiki.org/emacs/DirectoryVariables
The following therefore displays a message when you visit any file (under the directory in question):
((nil . ((eval . (message "hello")))))
The car of each list in the dir-locals form is generally a major mode symbol, or nil (as in the above example) in which case the settings apply in any major mode.
The car can also specify a sub-directory string, in which case the cdr is another dir-locals form with settings applicable to that sub-dir.
https://stackoverflow.com/questions/7334565/how-can-i-move-php-mode-settings-from-emacs-to-dir-locals-el/7340962#7340962 Directory local variables are just that – variables; not elisp forms to be evaluated. Fortunately, that is provided for via the eval pseudo-variable:
((php-mode (indent-tabs-mode . t) (c-basic-offset . 4) (tab-width . 4) (eval . (progn (c-set-style "bsd") (c-set-offset 'arglist-close 'c-lineup-arglist-operators) (c-set-offset 'arglist-intro 'c-basic-offset) (c-set-offset 'arglist-cont-nonempty 'c-lineup-math) (c-set-offset 'case-label '+)))))
Emacs will ask you to confirm that the code is safe when it encounters it, and will save it to the safe-local-variable-values list in the custom-set-variables sections of your init file if you wish.
If you are setting variables in an eval form, take care that you are setting buffer-local values (as a general rule, just use setq-local instead of setq in these cases).
M-: (info "(emacs)Directory Variables")
https://stackoverflow.com/questions/33457580/evaluate-values-in-dir-locals
projectile dir-locals
Настройки могут отличаться от проекта к проекту, даже если это один язык. На этот случай есть .dir-locals.el, чтоб устанавливать настройки конкретно для каталога (и подкаталогов) проекта. В projectile можно открыть так: C-c p E (M-x projectile-edit-dir-locals RET).
В файле может быть что-то такое:
((nil . ((secret-ftp-password . "secret") (compile-command . "make target-x") (eval . (progn (defun my-project-specific-function () ;; ... )))) (c-mode . (c-file-style . "BSD")))
Скобочки надо ещё пересчитать, что-то я в них не уверена.
Projectile предлагает много настроек через defcustom. Эти же настройки для отдельного проекта пишутся в dir-locals.el.
Так можно включить кэширование только для отдельного проекта:
((nil . ((projectile-enable-caching . t))))
Так добавить игнорируемый файл:
((nil . ((projectile-globally-ignored-files . '("MyBinaryFile")))))
Так поменять название проекта в modeline. И именно этим я пользуюсь!
((nil . ((projectile-project-name . "your-project-name-here"))))
Преднастроить типовые команды
There are a few variables that are intended to be customized via .dir-locals.el.
for configuration | projectile-project-configure-cmd | C-c p C |
for compilation | projectile-project-compilation-cmd | C-c p c |
for testing | projectile-project-test-cmd | C-c p P |
for installation | projectile-project-install-cmd | C-c p L |
for packaging | projectile-project-package-cmd | C-c p K |
for running | projectile-project-run-cmd | C-c p u |
Если там nil, их значение по умолчанию, то projectile будет предлагать соответствующую команду по умолчанию для этого типа проектов.
Если указать строку, emacs будет предлагать запустить её как внешнюю команду. Что удобно. Либо можно указать елисповую функцию:
(setq projectile-test-cmd #'custom-test-function)
или, скажем,
(setq projectile-test-cmd "make tests")
Запускается это в буфере компиляции. Если там не надо никакого интерактива, то оставить как есть. И скажем, мочь попросить рестартнуть процесс кнопочкой g
. Если надо, можно сделать projectile-<cmd>-use-comint-mode
(где <cmd>
— configure, compile, test, install, package или run) t
. Тогда соответствующая команда будет запускаться в comint, и можно будет с ней как-то общаться по идее. :)
Или указать сразу для всех:
(setq projectile-comint-mode t)