pasta raiz do projeto variável em .dir-locals.el

8

Estou usando o modo de empresa para conclusão no código C ++. Para informar ao clang back-end da empresa onde estão os arquivos de inclusão do projeto atual, tenho que usar o seguinte .dir-locals.elarquivo

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

Eu tenho que especificar o caminho completo sempre. Existe uma maneira de substituir full/path/to/project/rootpor uma variável que armazena o caminho do .dir-locals.elarquivo?

eu tentei

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

mas como default-directoryé avaliado no arquivo que estou abrindo, ele não retorna ao caminho da raiz do projeto, mas a algum outro caminho dentro do projeto.

kain88
fonte

Respostas:

5

Encontrei a solução com projétil . Tem uma função projectile-project-rootque pode ser usada para obter o caminho do projeto.

Não consigo usar o seguinte em .dir-locals.ele ele ainda funcionará quando mover o projeto ou usá-lo em outra máquina.

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

A única desvantagem é que você precisa de projétil e que o projeto precisa ser um projeto de projétil (não é um grande problema, pois todas as pastas com git / bzr / hg / ... são válidas).

atualizar

Como apontado nos comentários, também é possível usar

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

em vez de projectile-project-root.

kain88
fonte
3
(locate-dominating-file default-directory ".dir-locals.el")também pode ser uma opção, talvez até abreviada para uma função.
politza
Isso é basicamente o que projectile-project-rootfaz. Obrigado pela dica embora.
kain88
@politza: Eu não acho que isso funcione: ele será o mais próximo .dir-locals.el, não o de onde o formulário vem.
Clément
Eu acho que o uso de dir-locals-filevariável em vez de ".dir-locals.el" string é mais apropriado
sivakov512