clang-complete-asyncのcflagsを開いているファイルに応じてよしなに設定する

Emacsで、C/C++/Objective-C とかを書く時、clangを使った補完 clang-complete-async を使っている。

スクリーンショット 2014-04-01 15.11.38

いままではiOS用の設定決めうちで使っていたのだが、

  • たまにMacアプリを書くときにcflags切り替えがめんどくさい
  • 外部ライブラリを使っているプロジェクトで、そのライブラリのヘッダがよまれない

と言った不満があった。

ちょっと最近またMacアプリを書いていてよしなにやってくれるやつが欲しいな〜という熱がたかまったので作ってみた。

typester/clang-complete-helper

何をするやつ?

編集しているファイルから、xcodeプロジェクトを探して、その設定を読んでよしなにCFLAGSをセットしてくれるやつ。 なのでこれを使えば、xcodeのプロジェクトのファイルであればなにも考えなくてもclangによる補完が効くようになる。

実際にはプロジェクトに属しているかどうかまでは見ていなくて、上の階層をたどって .xcodeproj を探している感じになっているので、ファイル構成によっては期待通りうごかない場合もあるかもしれないが、 とりあえず自分の環境では良い感じにうごいているので満足した。

なにかあれば、p-rいただければと思う。

Emacsの設定

(setq ac-clang-cflags
      (split-string
       (shell-command-to-string (concat (executable-find "clang-complete-helper") " cflags "
                                        (and buffer-file-name
                                             (file-relative-name buffer-file-name))))))

こんなのを、設定に追加してやれば良い

自分がつかっている設定だと、

(defun ac-cc-mode-setup ()
  (setq ac-clang-cflags
        (split-string
         (shell-command-to-string (concat (executable-find "clang-complete-helper") " cflags "
                                          (and buffer-file-name
                                               (file-relative-name buffer-file-name))))))
  (setq ac-sources '(ac-source-clang-async))
  (ac-clang-launch-completion-process)
  (yas/minor-mode-on))

(add-hook 'c-mode-common-hook 'ac-cc-mode-setup)

こんな感じ。

Macでうまく使えない人へ

Xcode付属のclangでは補完できません。brewで入れましょう。

brew install --with-clang --all-targets --rtti --universal --jit llvm

これだけだとまだだめで、libclangからリンクしているlibLLVMのリンク指定が、 @executable_path を基準にしているので、 clang-complete も llvm-config とかと同じところに置くか、もしくは

sudo install_name_tool -change '@executable_path/../lib/libLLVM-3.3.dylib' /Users/typester/homebrew/lib/libLLVM-3.3.dylib /Users/typester/homebrew/opt/llvm/lib/libclang.dylib

みたいに install_name_tool でパスを直してあげる必要がある。こんなの普通の人は分からない。

参考になれば。

まとめ

まだまだEmacsでがんばれる。