閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

[Emacs][C++]Windows上のEmacsでc-eldoc.elを使う

いろいろ便利そうなc-eldoc.elですが、内部でcppに依存していてそのままでは使えなかったので、Windows環境でも使えるようにした時のメモを置いておきます。

インストール

install-elisp.el(auto-install.el)で一発。

M-x install-elisp-from-emacswiki c-eldoc.el

MinGWをインストール

cppを使うためにMinGWを入れます。

自分は MinGW | Minimalist GNU for Windows->MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net の中にある Automated MinGW Installer辺りのMinGW5.1.6.exeをダウンロードして実行しました。インストールフォルダはC:/MinGWとしました。

設定

.emacsに以下の記述を追加します。

(setq c-eldoc-cpp-command "C:\\MinGW\\bin\\cpp ") ;; ここにMinGWをインストールしたフォルダを指定する
(load "c-eldoc")
(setq c-eldoc-includes "-I./ -I../ -I\"C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/include\" ")
(add-hook 'c-mode-hook 'c-turn-on-eldoc-mode)
(add-hook 'c++-mode-hook
  (lambda ()
    (set (make-local-variable 'eldoc-idle-delay) 0.20)
      (c-turn-on-eldoc-mode)
))

c-eldoc-includeが一番大事な設定で、ここで使っているライブラリのパスを指定しておく必要があります。自分の環境ではVCがメインなので、そのパスを指定しています(環境変数とか設定されてるのでそちらを使った方が良いのでしょうが、手抜きしています)。

使ってみる

.cppファイルを開いて、関数呼び出しを行う部分にキャレットを持っていくと、以下のようになります。

f:id:wata_d:20100505220823p:image

Boostなどに対応したい


c-eldoc-includesにBoostのパスなど指定すれば対応できますが、c-eldocはプリプロセッサの出力を解析しているので、かなり遅くなります。以下のコード(http://www.kmonos.net/alang/boost/classes/string_algo.html)でsplit関数の引数を見るのに自分の環境では3秒ほどかかりました。

#include <string>
#include <boost/algorithm/string.hpp>

int main()
{
	std::string message = "This is a pen";
	std::vector<std::string> v;
	boost::algorithm::split(v, message, boost::algorithm::is_space());
}

ハイスペックな環境とかならありかもしれませんが、どこまでいけるのかな。また、タグにC++なんて書いてC++前提で書いていますが、もともとC言語用のものなので、オーバーロードした関数などはおそらく最初に見つかったものを表示するなどしていて、深く使うには厳しかったりするかもしれません。まだろくに使っていないのでわかりませんが。

「Function doesn't exist...」と言われてしまう

関数が見つからないよ、というエラーですが、あるはずの関数が見つからない場合はプリプロセスに失敗しているのかもしれません。*ソースファイル名-preprocessed*バッファにコマンドの出力結果が出ているので、ここから原因を探せるかもしれません。自分はcppコマンドが見つからないよ、というメッセージを見てはじめてcppが必要なことに気づきました……。