carpeta raíz del proyecto variable en .dir-locals.el

8

Estoy usando el modo empresa para completar en código C ++. Para decirle al clang backend de la compañía dónde están los archivos de inclusión para el proyecto actual, tengo que usar el siguiente .dir-locals.elarchivo

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

Tengo que especificar la ruta completa siempre. ¿Hay alguna manera de reemplazar full/path/to/project/rootcon una variable que almacena la ruta del .dir-locals.elarchivo?

Lo intenté

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

pero como default-directoryse evalúa en el archivo que estoy abriendo, no vuelve a la ruta de acceso de la raíz del proyecto sino a otra ruta dentro del proyecto.

kain88
fuente

Respuestas:

5

Encontré la solución con proyectil . Tiene una función projectile-project-rootque puede usarse para obtener la ruta del proyecto.

No puedo usar lo siguiente .dir-locals.ely seguirá funcionando cuando mueva el proyecto o lo use en otra máquina.

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

El único inconveniente es que necesita proyectil y que el proyecto tiene que ser un proyecto de proyectil (no es un gran problema ya que cada carpeta con git / bzr / hg / ... es un proyecto válido).

actualizar

Como se señaló en los comentarios, también es posible utilizar

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

en lugar de projectile-project-root.

kain88
fuente
3
(locate-dominating-file default-directory ".dir-locals.el")También puede ser una opción, tal vez incluso abreviado en una función.
politza
Esto es más o menos lo que projectile-project-roothace. Gracias por el consejo.
kain88
@politza: no creo que funcione: recogerá el más cercano .dir-locals.el, no el que proviene del formulario.
Clément
Creo que usar la dir-locals-filevariable en lugar de la cadena ".dir-locals.el" es más apropiado
sivakov512