Jak ustawić zmienną lokalną katalogu względem lokalizacji pliku .dir-locals.el?

15

Często znajduję się w sytuacji, w której kazano mi umieścić ścieżki względne jako zmienną lokalną katalogu. Na przykład cmake IDE „s cmake-ide-project-diri cmake-ide-build-dir. Oczywiście nie jest to zbyt przenośne.

Więc zamiast

.dir-locals.el:

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

Chcę coś takiego

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

Jak mogę zdefiniować taką zmienną directory-of-current-dir-locals-file? A jak ustawiłbym na przykład cmake-ide-build-dir, co zwykle jest (concat directory-of-current-dir-locals-file "build")?

Pływ
źródło

Odpowiedzi:

7

Moje dotychczasowe rozwiązanie (na podstawie tej odpowiedzi 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")))
         )))
Pływ
źródło
4
Możesz także użyć(locate-dominating-file default-directory ".dir-local.el")
ibizaman
0

Możesz zdefiniować zmienną za pomocą (defvar directory-of-current-dir-locals-file "/home/user/code/project").

Konstantin Morenko
źródło
2
Przepraszam, może moje pytanie nie było jasne. Ale pomysł polegał na tym, aby nie używać absolutnych ścieżek. Ponieważ wiesz, że chcesz ustawić zmienną na coś względem .dir-locals.elpliku.
Flow