Vim Advent Calendar 2013 : Vim で libclang を使用した C++ の便利プラグインをつくった

この記事は Vim Advent Calendar 2013 48日目の記事になります。
Vim Advent Calendar 2013 の記事を書きたい人は明日すぐに書けますよ!!


さて、今回の記事なのですが、少し前から Clang の libclang を使用したプラグインを作成しています。
libclang を利用する事で比較的感に Vim から型や定義位置の情報など取得することができます。
まだ完成というわけではないのですが、最低限の機能は実装できたので一旦公開してしまおうかなーと思います。
だいぶ煮詰まってきているのでフィードバックなどがもらえると嬉しいです。

[動作環境]


Clang 3.3 もしくは Clang 3.4 で動作確認を行っています。
(3.5 でも動作するとは思うけど確認したわけではない。
また、Vim 側は +python が必要となります。

[実装されている機能]

  • カレントバッファでインクルードされているヘッダーファイル一覧の出力
    • :SnowdropEchoIncludes
    • :Unite snowdrop/includes
  • カーソル下の単語の定義位置、もしくは宣言位置へ移動する機能
    • :SnowdropGotoDefinition
  • カーソル下の型情報の取得
    • :SnowdropEchoTypeof
  • カーソル下の関数の戻り値型情報の取得
    • :SnowdropEchoResultTypeof
  • カレントバッファのアウトラインの出力

[インストール]

NeoBundle "osyo-manga/vim-snowdrop"


libclang や +python 以外には他に依存している機能やプラグインなどはありません。

[設定]

" libclang が保存されているディレクトリへのパス
let g:snowdrop#libclang_directory = "C:/llvm/bin"

" インクルードディレクトリのパスを設定
let g:snowdrop#include_paths = {
\   "cpp" : {
\       "C:/MinGW/lib/gcc/mingw32/4.6.2/include",
\       "C:/cpp/boost",
\       "C:/cpp/sprout",
\   }
\}

" 使用する clang のコマンドオプション
let g:snowdrop#command_options = {
\   "cpp" : "-std=c++1y",
\}

[動作確認]

snowdrop.vim を導入後に次のコマンドを呼ぶことで、問題なく動作するかどうかを確認する事ができます。

:SnowdropVerify


このコマンドを呼んで出力される結果が全て [Success] であれば問題ありません。
もし [Failure] が発生した場合は g:snowdrop#libclang_directory などに正しく libclang が保存されているディレクトリへのパスが設定されているかどうかを確認してみてください。

[カレントバッファでインクルードされているヘッダーファイルの一覧を出力]

カレントバッファでインクールドされているヘッダーファイルの一覧を出力します。

:SnowdropEchoIncludes

http://gyazo.com/4a798e1668e204e35c5e5a5d733d6d62.png


また、unite.vim へと出力することもできます。

:Unite snowdrop/includes

https://f.cloud.github.com/assets/214488/1932993/85501f74-7ed3-11e3-9143-4844082e4b4c.PNG

[定義位置、もしくは宣言位置へ移動する]

カーソル下の単語の定義位置へと移動します。
定義が見つからなければ宣言位置へ移動します。

:SnowdropGotoDefinition


また、この時のファイルの開かれ方は、

let g:snowdrop#goto_definition_open_cmd = "edit"

で設定することができます。


[型情報の取得]

カーソル下の単語の型情報を出力します。

:SnowdropEchoTypeof

http://gyazo.com/490e613d0658f0790d9e063f346c90ff.png


また、以下のように設定することでバールン表示することもできます。

function! s:cpp()
	setlocal balloonexpr=snowdrop#ballonexpr_typeof()
	setlocal ballooneval
endfunction

augroup my-cpp
	autocmd!
	autocmd FileType cpp call s:cpp()
augroup END

https://f.cloud.github.com/assets/214488/1932966/22262f2e-7ed3-11e3-8ea3-e2ec1858bea4.PNG

[関数の戻り値型情報の取得]

カーソル下の関数の戻り値型情報を出力します。

:SnowdropEchoResultTypeof

http://gyazo.com/ca656cf9f6019b1272b6add3b32c5475.png

[アウトラインの出力]

カレントバッファのアウトラインの出力を unite.vim へ出力します。

:Unite snowdrop/outline

https://f.cloud.github.com/assets/214488/1933045/a4a85278-7ed4-11e3-8ae7-c9ef6639ff24.PNG

[コード補完]

neocomplete.vim を利用してコード補完を行うことができます。
これを利用したい場合は、以下の設定を行って下さい。

let g:neocomplete#sources#snowdrop#enable = 1

" 補完に時間がかかってもスキップしない設定
let g:neocomplete#skip_auto_completion_time = ""

http://gyazo.com/415301c1bd2fbba612eacce057efccc3.png


と、いう感じで現在実装されている機能は上記のようになります。
また全然試せていないのでなにか問題があれば Issues などへと報告してもらえると助かります。