読者です 読者をやめる 読者になる 読者になる

ぽんぽこ日記

プログラミング、読書、日々の生活

clangを使ったCのコード補完

私は、iOS/Objective-Cのコーディングには専らEmacsを使っています。下記ブログのおかげでかなり快適なObjective-Cのコーディング環境が手に入りました。

(1) Emacs で iPhone アプリ開発を快適にするための設定

ただ若干気になるところとして、auto-complete-modeの補完候補の精度がXcodeのそれと比べて若干落ちることがあります。

Xcodeだと、たとえば、

  Foo a;
  [a xx

クラスFooのaオブジェクトのメソッド呼び出しの文脈では、Fooが実装する"xx"で始まるメソッドの候補をサジェストしてくれます。emacsでも文脈に応じた補完を実現したいものです。

そこで、Google先生に聞いてみたところ、

(2) Clang Completion Source for AutoComplete in Emacs

というのを見つけました。(※リンク切れてました。ソースはここから取得できます。)

ClangというのはLLVMコンパイラプロジェクトの成果の一つで、C言語系のプログラミング言語構文解析エンジンのフロントエンドとして動作し、ソースコードの静的解析を行うことで、シンボルの補完やソースのインデクシングを提供するものと言うことです。

LLVM/Clang実践活用ハンドブック

LLVM/Clang実践活用ハンドブック

上のページで公開しているauto-comple-clang.elは、auto-complete-modeの補完ソースとして、clangの解析結果を使うというものです。

XcodeがインストールされたMacOSXにはclangコマンドがすでにインストール済みと言うことで、早速上のページからauto-comple-clang.elをダウンロードして、試してみました。


まず、auto-comple-clang.elをload-path上のディレクトリに置いて、objc-mode編集時の補完ソースをclangに設定します。

(require 'auto-complete-clang)

(add-hook 'objc-mode-hook
         (lambda ()
           (push 'ac-source-clang-complete ac-sources)
	   ...
         ))


次に、clangに渡すインクルードファイルのパスなどを設定します。

(setq clang-completion-flags (list "-Wall" "-Wextra" "-fsyntax-only" "-ObjC" "-std=c99" "-isysroot" "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk" "-I."  "-D__IPHONE_OS_VERSION_MIN_REQUIRED=30200"))

なお、(1)のサイトを参考にしてflymakeも設定している人は、flymake-objc-compile-default-optionsや、flymake-objc-compile-optionsの内容を設定すればよいかと思います。

(setq clang-completion-flags (append flymake-objc-compile-default-options flymake-objc-compile-options ))

iOSプログラマで、ここまで読んでいただいた方には申し訳ないのですが、実は、どうやら最新のバージョン2.8においても、objective-cのクラスやメソッドを認識する機能が実装されていないようで、C言語の関数しか補完候補に現れません。

なので現状は、私が求めている結果は得られていませんが、、(2)のサイトによると、C++ならテンプレートクラスも含めばっちり補完してくれるらしいので、専らC++を書かれる方には相当便利な機能では無かろうかと思います。

2010/11/1補記:
どうやらobjective-Cクラス/メソッドも認識しているようです。私の勘違いでした。他のauto-complete情報源と併せて設定したり試行錯誤していたせいかもしれません。すくなくとも現状、ac-sourcesにac-source-clang-completeのみを設定する限りにおいてはうまく補完できるようになりました。

ちなみに、clangを直接たたいて、現状の動作を確認するには、下記のような引数で実行します。

clang   -cc1  -D__IPHONE_OS_VERSION_MIN_REQUIRED=30200  -isysroot  /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk   -I. -fblocks  -std=c99 -code-completion-at test.m:23:13  test.m 2
  • code-completion-at の後の引数に、対象となるソースファイル名と、補完したいカーソル位置の行番号、カラムを指定します。-fblocksをつけないとiOS4で導入されたblocksを用いたヘッダの箇所がコンパイルエラーとして認識されてしまいます。

きつねさんでもわかるLLVM ~コンパイラを自作するためのガイドブック~

きつねさんでもわかるLLVM ~コンパイラを自作するためのガイドブック~

【スポンサーリンク】