Wie kann ich die lokale Verzeichnisvariable relativ zum Speicherort der Datei .dir-locals.el festlegen?

15

Ich befinde mich oft in der Situation, dass ich aufgefordert werde, relative Pfade als lokale Verzeichnisvariable anzugeben. Zum Beispiel cmake-ide 's cmake-ide-project-dirund cmake-ide-build-dir. Das ist natürlich nicht sehr portabel.

Also statt

.dir-locals.el:

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

Ich möchte so etwas wie

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

Wie kann ich eine solche Variable definieren directory-of-current-dir-locals-file? Und wie würde ich zum Beispiel einstellen cmake-ide-build-dir, was typisch ist (concat directory-of-current-dir-locals-file "build")?

Fließen
quelle

Antworten:

7

Meine bisherige Lösung (basierend auf dieser Stackoverflow-Antwort ):

.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")))
         )))
Fließen
quelle
4
Sie können auch(locate-dominating-file default-directory ".dir-local.el")
ibizaman
0

Sie könnten Variable mit definieren (defvar directory-of-current-dir-locals-file "/home/user/code/project").

Konstantin Morenko
quelle
2
Entschuldigung, vielleicht war meine Frage nicht klar. Die Idee war jedoch, keine absoluten Pfade zu verwenden. Da Sie wissen, dass Sie die Variable auf einen Wert relativ zur .dir-locals.elDatei setzen möchten .
Flow