.dir-locals.el内の可変プロジェクトルートフォルダー


8

C ++コードでの補完に会社モードを使用しています。現在のプロジェクトのインクルードファイルの場所を会社のclangバックエンドに伝えるには、次の.dir-locals.elファイルを使用する必要があります

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

常にフルパスを指定する必要があります。ファイルのfull/path/to/project/rootパスを格納する変数に置き換える方法はあり.dir-locals.elますか?

私は試した

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

しかし、default-directory私が開いているファイルで評価されているので、プロジェクトルートのパスに戻るのではなく、プロジェクト内の他のパスに戻ります。

回答:


5

私は発射物で解決策を見つけました。projectile-project-rootプロジェクトのパスを取得するために使用できる関数があります。

私は以下を使用でき.dir-locals.elません。プロジェクトを移動したり、別のマシンで使用したりしても、引き続き機能します。

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

唯一の欠点は、それが発射物を必要とすることと、プロジェクトは発射物プロジェクトでなければならないことです(git / bzr / hg / ...を含むすべてのフォルダーが有効なプロジェクトであるため、それほど問題ではありません)。

更新

コメントで指摘されているように、使用することも可能です

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

の代わりにprojectile-project-root


3
(locate-dominating-file default-directory ".dir-locals.el")オプションの場合もあれば、関数に省略されている場合もあります。
politza

これはほとんど何をするかprojectile-project-rootです。先端をありがとう。
kain88

@politza:私はそれがうまくいくとは思いません:それは.dir-locals.elフォームから来たものではなく、最も近いをピックアップします。
クレメント2016

dir-locals-file".dir-locals.el"文字列の代わりに変数を使用する方が適切だと思います
sivakov512
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.