Comment puis-je définir la variable locale du répertoire par rapport à l'emplacement du fichier .dir-locals.el?

15

Je me retrouve souvent dans la situation où on me dit de mettre des chemins relatifs comme variable locale de répertoire. Par exemple cmake-ide « s cmake-ide-project-diret cmake-ide-build-dir. Bien sûr, ce n'est pas très portable.

Donc au lieu de

.dir-locals.el:

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

Je veux quelque chose comme

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

Comment puis-je définir une telle variable directory-of-current-dir-locals-file? Et comment pourrais-je définir par exemple cmake-ide-build-dir, qui est généralement (concat directory-of-current-dir-locals-file "build")?

Couler
la source

Réponses:

7

Ma solution jusqu'à présent (basée sur cette réponse 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")))
         )))
Couler
la source
4
Vous pouvez également utiliser(locate-dominating-file default-directory ".dir-local.el")
ibizaman
0

Vous pouvez définir une variable avec (defvar directory-of-current-dir-locals-file "/home/user/code/project").

Konstantin Morenko
la source
2
Désolé, ma question n'était peut-être pas claire. Mais l'idée était de ne pas utiliser de chemins absolus. Puisque vous savez que vous souhaitez définir la variable sur quelque chose par rapport au .dir-locals.elfichier.
Flow