'auto' 宣言の型を調べるプラグイン作った powered by momonga.vim #2.2

2/1 から 2/2 にかけて開催された @supermomonga さん主催の momonga.vim 2.2 に参加しました. 少人数でぐだぐだ雑談しながら作業する感じの会です.

clang-type-inspector.vim つくった

C++11 から auto を指定することで変数宣言の型を推論させることができるようになり,C++14 からは関数の戻り値型も推論させることができるようになりました.しかし,ソースコードから型の情報がなくなってしまうと変数の型を追うのが大変になってしまうのではないかという議論がたまに出たりしています.

そこで今回の momonga.vim では,C++auto を使った変数宣言や関数定義における型情報の取得を行う clang-type-inspector.vim というプラグインを作りました. 主に次のような機能があります.

  • カーソル下の型を表示するマッピング
  • カーソルが auto の位置に来た時に自動で型を表示する
  • マウスカーソルが指す位置の型をバルーンで表示(gVim 限定)

Screenshot

neobundle.vim なら簡単にインストールできます.

" neobundle で管理
NeoBundleLazy 'rhysd/libclang-vim', {
            \ 'build' : {
            \       'windows' : 'echo "Please build manually"',
            \       'mac' : 'make',
            \       'unix' : 'make',
            \   }
            \ }
NeoBundleLazy 'rhysd/clang-type-inspector.vim', {
            \ 'depends' : 'rhysd/libclang-vim',
            \ 'autoload' : {
            \       'filetypes' : 'cpp'
            \   }
            \ }

libclang に依存しています.libclang のインストール方法は libclang-vim の README などを参考にして入れてください. make でビルドするには llvm-config コマンドが必要です.

.vimrc に設定を書きたい場合は次のような感じになります.

" <C-t> でカーソル下の型を表示する
augroup clang-inspect-type-mapping
    autocmd!
    autocmd FileType cpp nmap <C-t> <Plug>(clang-inspect-type-at-cursor)
augroup END

" カーソルが auto の位置に来た時に自動で型を表示する機能を OFF にしたいとき(デフォルトで ON)
" let g:clang_type_inspector#automatic_inspection = 0

" マウスカーソルが指す位置の型表示を OFF にしたいとき(デフォルトで ON)
" let g:clang_type_inspector#disable_balloon = 1

実装に libclang-vim というライブラリを利用しています.これは Vim で libclang の構文解析機能を使うためのライブラリで,AST 情報等が Vim script から取れるようになっています.きつねさんとおぼえる! Clangきつねさんとおぼえる! Clang おかわり を読んで,libclang を触るついでに作成しました.内部的には Vim script の libcall() という標準関数を使って C インターフェースを呼び出す実装になっています.

現時点では libclang では直接 auto の型を推論できないので,AST を libclang-vim で引っ張ってきて変数初期化式の右辺の型を見たり,関数内の return 文の型を見たりして自前で推論を実装しています.ただ,どうやら LLVM 3.2 まではちゃんと auto の型が推論できていたらしく,今それができないのはバグではないかというチケットLLVM の bugzilla で上がっていて,これが修正されればさらに精度良く推論することができるようになりそうです.

なお,osyo さんvim-snowdrop にも型を表示する機能があります.こちらは libclang の python バインディングを使った実装になっています.

momonga.vim #2.2 のようす

ここから当日の様子まとめ.

昼頃にももんが邸に到着するとももんがさんと thinca さんが居て,部屋の掃除をちょっと手伝う.その後 deris さんと rbtnn さんも合流して全員で昼食へ.つけ麺を食べる.魚介系で麺も好みな感じで,量も多くてお腹いっぱいになって良かった.momonga.vim #2.1 の KPT でオシャレランチというのが挙がっていたけれど,達成されたかは微妙な感じ.

ももんが邸に戻ってからは眠気と戦いながら雑談&作業タイム.この時は puyo.vim に大量に時間を持っていかれた.puyo.vim の進捗キラー感すごく,鋭意実装中という :PuyoTeto コマンドにも期待が高まった.なんかみんな互いの進捗が無いことを確認しながら作業していた気がする.Vim script の分からないところは thinca さんに教えてもらえるのでとても助かった.

そんなこんなしているうちに 晩御飯時になったので中華料理屋に行った.麻婆豆腐定食おいしかったけれど,昼の分がまだお腹に残っていたのでちょっと食べ過ぎた感あった.deris さんとはここで別れて,徹夜組はももんが邸に戻る.

戻ってぐだぐだしていると vimrc 読書会の時間になったので lingr で参加.丁度ももんがさんの vimrc の番だったので,その場で色々雑談しつつ読んでいた.

vimrc 読書会の後は作業していたけれど,夕飯前に clang-type-inspector.vim が形だけできてしまい安心しきって眠気に負けていたのであまり覚えていない.thinca さんが「ほえほえ〜」って言っていたような気がする.1時ぐらいにももんがさんが「寝るつもりはない」と言いつつアイマスクをして真っ先に就寝したので,僕も仮眠を取ることにした.起きたら4時ぐらいで周りは全員寝ていたので,ももんがさんの vimrc を勝手にいじって vim-plz_donate をインストールしたり,vim-optparse にデフォルト値対応を入れるための実装をしたりしていた.vim-plz_donate めちゃくちゃ便利だった… デフォルト値対応はあとで Vital.OptionParser に移植する予定.

朝8時ぐらいになって周りも起きてきた(ももんがさんは結局7時間ぐらい寝ていた)ので,朝食をモスバーガーに買いに行った.ちょっと量が少なかったけれど,その後ももんがさんがチキンナゲットを揚げてくれたので助かった.

そんなこんなで12時前にお開きとなり,電源ケーブルを忘れるというドジをやりつつもどうにか無事に帰宅して爆睡した.

参加者の皆様(特に主催のももんがさん)ありがとうございました & お疲れ様でした.また次回も是非やっていきたいです.(次回は真ももんが邸で)