variabler Projektstammordner in .dir-local.el

8

Ich verwende den Firmenmodus für die Vervollständigung in C ++ - Code. Um dem Clang-Backend des Unternehmens mitzuteilen, wo sich die Include-Dateien für das aktuelle Projekt befinden, muss ich die folgende .dir-locals.elDatei verwenden

((c++-mode (eval setq company-clang-arguments (append 
                                               company-clang-arguments
                                               '("-I/full/path/to/project/root/include"))))

Ich muss immer den vollständigen Pfad angeben. Gibt es eine Möglichkeit, full/path/to/project/rootdie .dir-locals.elDatei durch eine Variable zu ersetzen , in der der Pfad gespeichert ist?

Ich habe es versucht

 (c++-mode (eval setq company-clang-arguments (append
                                               company-clang-arguments
                                               (list concat "-I" default-directory "src")))))

Da dies default-directoryjedoch in der Datei ausgewertet wird, die ich öffne, kehrt es nicht zum Pfad des Projektstamms zurück, sondern zu einem anderen Pfad innerhalb des Projekts.

kain88
quelle

Antworten:

5

Ich habe die Lösung mit Projektil gefunden . Es hat eine Funktion, mit projectile-project-rootder der Projektpfad abgerufen werden kann.

Ich kann Folgendes nicht verwenden .dir-locals.elund es funktioniert immer noch, wenn ich das Projekt verschiebe oder es auf einem anderen Computer verwende.

((nil . ((eval . (progn
                   (require 'projectile)
                   (setq company-clang-arguments (delete-dups (append
                                                  company-clang-arguments
                                                  (list (concat "-I" (projectile-project-root) "src"))))))))))

Der einzige Nachteil ist, dass Sie ein Projektil benötigen und dass das Projekt ein Projektilprojekt sein muss (kein großes Problem, da jeder Ordner mit git / bzr / hg / ... ein gültiges Projekt ist).

aktualisieren

Wie in den Kommentaren erwähnt, ist es auch möglich, zu verwenden

(locate-dominating-file default-directory ".dir-locals.el")

statt projectile-project-root.

kain88
quelle
3
(locate-dominating-file default-directory ".dir-locals.el")kann auch eine Option sein, vielleicht sogar in eine Funktion abgekürzt.
Politza
Das ist so ziemlich das, was es projectile-project-roottut. Danke für den Tipp.
Kain88
@politza: Ich denke nicht, dass das funktioniert: Es wird das nächste aufnehmen .dir-locals.el, nicht das, von dem das Formular stammt.
Clément
Ich denke, dass die Verwendung von dir-locals-fileVariablen anstelle von ".dir-Locations.el" Zeichenfolge besser geeignet ist
sivakov512