emacsでインテリセンス

CEDETなるものを使うとわりと簡単にできるらしいので,導入してみた.
http://cedet.sourceforge.net/

ダウンロードして解凍して,コンパイルを適当に行う.

$ cd cedet-1.0pre7
$ make
$ pwd
/path/to/cedet-1.0pre7

.emacsに設定を追加

;; CEDET
(load-file "/path/to/cedet-1.0pre7/common/cedet.el")
(require 'semantic-gcc)

(semantic-add-system-include "/opt/local/include" 'c++-mode)
(semantic-add-system-include "/opt/local/include" 'c-mode)

(semantic-load-enable-gaudy-code-helpers)

(add-hook 'c-mode-common-hook 'my-c-mode-cedet-hook)

(defun my-c-mode-cedet-hook ()
  (local-set-key "\C-xp" 'eassist-switch-h-cpp)
  (local-set-key "\C-xe" 'eassist-list-methods)
  ;;(local-set-key "." 'semantic-complete-self-insert)
  ;;(local-set-key ">" 'semantic-complete-self-insert))
  )

Macの場合は,これで行けるはず.例えば,

#include <sys/socket.h>
int
main(int argc, char *argv[])
{
    sockaddr saddr;

    saddr.    // この行を入力中
}

とやれば,別のバッファに

Click <mouse-2> on a completion to select it.
In this buffer, type RET to select the completion near point.

Possible completions are:
sa_data                            sa_family
sa_len

と表示されて,あとは適当に選ぶだけ.tabや,Meta-\で補完もできる.
と思ったけれど,semantic-complete-self-insertはちょっと微妙だったのでコメントアウトしておきました.無くても数秒待てば補完されるし,問題ないかな.


他には,

Ctrl-x p

でヘッダとソースファイル間の移動.

Ctrl-x e

でファイル中にある関数の表示と移動.

が出来る.


使い始めは補完候補のデータベースが構築されていないため非常に重いが,一度構築されてしまえば,次回からはサクサク動くようになる.

また,以下のように,CやC++のインクルードファイルのパスを指定してやれば,boostとかのクラスでも補完候補が別のバッファに表示されるようになる.

(semantic-add-system-include "/path/to/boost" 'c++-mode)

そのかわり,補完用データベースの作成に若干時間がかかるが,これは仕方がない.


CEDETは他にもタグジャンプや,プロジェクト管理なども強化出来るそうだが,そこまでやるならXCodeとかを使えばいいんじゃないだろうかと思う.インテリセンスがあれば,プログラムを書く上では十分でしょう.Visual Studioなどはかなり前(もう10年以上も前ぐらい?)からインテリセンスがあったけれど,最近は,emacsとかvimでも出来るようになったんだなぁと感慨ひとしお.

代償としてemacsの起動が若干遅くなってしまうが,これもしょうがないね・・・