Как установить локальную переменную каталога относительно расположения файла .dir-locals.el?

15

Я часто оказываюсь в ситуации, когда мне говорят, что относительные пути должны указываться в качестве локальной переменной каталога. Например , CMake-язя «S cmake-ide-project-dirи cmake-ide-build-dir. Конечно, это не очень портативно.

Так что вместо

.dir-locals.el:

((nil . ((cmake-ide-project-dir . "/home/user/code/project"))))

Я хочу что-то вроде

((nil . ((cmake-ide-project-dir . directory-of-current-dir-locals-file))))

Как я могу определить такую ​​переменную directory-of-current-dir-locals-file? И как бы я установить, например cmake-ide-build-dir, который обычно (concat directory-of-current-dir-locals-file "build")?

поток
источник

Ответы:

7

Мое решение до сих пор (на основе этого ответа Stackoverflow ):

.dir-locals.el:

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

((nil . ((eval . (set (make-local-variable 'my-project-path)
                      (file-name-directory
                       (let ((d (dir-locals-find-file ".")))
                         (if (stringp d) d (car d))))))
         (cmake-ide-project-dir . my-project-path)
         (eval . (setq cmake-ide-build-dir (concat my-project-path "build")))
         )))
поток
источник
4
Вы также можете использовать(locate-dominating-file default-directory ".dir-local.el")
ibizaman
0

Вы можете определить переменную с (defvar directory-of-current-dir-locals-file "/home/user/code/project").

Константин Моренко
источник
2
Извините, может быть, мой вопрос не был ясен. Но идея состояла в том, чтобы не использовать абсолютные пути. Поскольку вы знаете, что хотите установить переменную на что-то относительно .dir-locals.elфайла.
поток