Vim で C++ のコーディングを行うなら知っておきたい10のこと

第二弾?わたしが普段 C++ のコーディングを行っている時の機能とか、プラグインとかのまとめです。
逆にいうと、これぐらいしか知らないので、もっと便利な機能があれば教えてください。
結構ざっくりと書いたので、分からないことがあれば、コメントか Twitter でリプもらえれば反応出来るかもしれません。
まぁ『Vim でこういう事ができるんだぜー!』的な感じで読んでもらえれば幸いです。

まえがき

[使用しているプラグイン]

細かい設定なんかは割愛しています。
うまく動作しなかった場合は、:help や、各プラグインのドキュメントを参照して下さい。

☆1.複数行コメント

vim-user : http://vim-users.jp/2011/03/hack205/
複数行を選択した状態で、コメントアウトを行います。


[キーバインド]

c コメントアウト
C コメントを外す

☆2.ヘッダーファイルを開く

等のキーバインドでカーソル上のヘッダーファイルを開くことが出来ます。
使用する為には、path にインクルードディレクトリを追加する必要があります。


[キーバインド]

f 新しいウィンドウで開く
新しいウィンドウで開く
gf 新しいバッファで開く
gf 新しいタブで開く

[_vimrc]

" path にインクルードディレクトリを設定します
let $BOOST_ROOT = "C:/boost/boost_1_46_1"
set path+=$BOOST_ROOT


[追記]
開き方がいくつかあったので、追記しました。

☆3.インクルード時のヘッダーファイルのディレクトリ補完

#include を行う際に、インクルードディレクトリから、ヘッダーファイルへのディレクトリ補完を行います。
(msvc2010の様な機能)


[プラグイン]

[_vimrc]

" path もしくは、g:neocomplcache_include_paths に
" インクルードディレクトリを設定します
let $BOOST_ROOT = "C:/boost/boost_1_46_1"
set path+=$BOOST_ROOT


[参照]
http://d.hatena.ne.jp/osyo-manga/20110213/1297615382


☆4.Vim からコンパイル/実行を行う

同型のプラグインとして、QuickRun が有名ですが、わたしは、SingleCompile を使用しています。
SingleCompile では、QuickFix で出力が行われるので、比較的簡単にエラー箇所を追う事が出来ます。
また、各コンパイラの拡張設定や、複数コンパイラを設定することで、切り替える事が出来ます。
詳しくは、下記を参照してください。


[プラグイン]

[コマンド]

:SCCompile コンパイル
:SCCompileRun コンパイル実行
:SCViewResult コンソールの出力結果を取得


[参照]
http://www.vim.org/scripts/script.php?script_id=3115
http://d.hatena.ne.jp/osyo-manga/20110302/1299080946
http://d.hatena.ne.jp/osyo-manga/20110220/1298235720

☆5.クロスコンパイルを行う

SingleCompile では、複数のコンパイラを設定することによって、動的にコンパイラを変更することが出来ます。


[プラグイン]

[コマンド]

:SCChooseCompiler コンパイラの選択

[_vimrc]

" gcc の C++0x 版を追加する
let common_run_command = '$(FILE_TITLE)$'
call SingleCompile#SetCompilerTemplate(
    \ 'cpp', 'g++ 0x', 
    \ 'GNU C++ Compiler', 'g++', '-std=gnu++0x -g -o $(FILE_TITLE)$', 
    \common_run_comman


☆6.コンパイルエラーを出力/街頭箇所へ飛ぶ

SingleCompile では、Quickfix に出力が行われるので、それを利用します。
Quickfix のウィンドウから、各エラー箇所へジャンプする事が出来ます。


[プラグイン]

[コマンド]

:copen Quickfix ウィンドウを開く

☆7.エラー箇所を可視化

hier は、Quickfix の該当箇所をハイライト表示で表示するプラグインです。
これを利用して、SingleComple で出力されたエラー箇所(Quickfix)を可視化します。


[プラグイン]

[_gvimrc]

" _gvimrc で定義する
" 波線で表示する場合は、以下の設定を行う
" エラーを赤字の波線で
execute "highlight qf_error_ucurl gui=undercurl guisp=Red"
let g:hier_highlight_group_qf  = "qf_error_ucurl"
" 警告を青字の波線で
execute "highlight qf_warning_ucurl gui=undercurl guisp=Blue"
let g:hier_highlight_group_qfw = "qf_warning_ucurl"


[参照]
http://www.vim.org/scripts/script.php?script_id=3564
https://github.com/jceb/vim-hier
http://d.hatena.ne.jp/osyo-manga/20110501/1304273451
[注意]
clang だとエラーと警告の区別がうまく行われません。
上記の設定の場合では、警告も赤字の波線でハイライトが行われます。
色がうまく反映されない場合は、g:hier_highlight_group_qf 等をプラグインの読み込み前に設定してみて下さい。

☆8.バッファ内のクラス、関数の一覧を列挙する

unite-outline を使用して、バッファ内のクラス、関数の一覧を Unite で列挙します。


[プラグイン]

[コマンド]

:Unite outline


[参照]
https://github.com/Shougo/unite.vim
https://github.com/h1mesuke/unite-outline/wiki


☆9.関数定義にジャンプする

ctags で生成されたタグファイルを利用して、関数やクラス等の定義にジャンプします。
タグファイルは、neocomplcache が include 時に自動で生成します。


[外部ツール]

[プラグイン]

[キーバインド]

カーソル位置の定義に飛ぶ
tu 現在のバッファのタグファイルを生成、tags の更新

[vimrc]

" 現在のバッファのタグファイルを生成する
" neocomplcache からタグファイルのパスを取得して、tags に追加する
nnoremap <expr><Space>tu g:TagsUpdate()
function! g:TagsUpdate()
    execute "setlocal tags=./tags,tags"
    let bufname = expand("%:p")
    if bufname!=""
        call system(
            \ "ctags ". 
            \ "-R --tag-relative=yes --sort=yes ".
            \ "--c++-kinds=+p --fields=+iaS --extra=+q "
            \ .bufname." `pwd`")
    endif
    for filename in neocomplcache#sources#include_complete#get_include_files(bufnr('%'))
        execute "set tags+=".neocomplcache#cache#encode_name('include_tags', filename)
    endfor
    return ""
endfunction


[参照]
http://d.hatena.ne.jp/osyo-manga/20110206/1296988521
[注意]
ctags では、プリプロセスの展開がうまく行われなかったり、精度が低かったりするので、VisualStudi なんかと比べてしまうと見劣りしていまうかもしれません。
libstdc++ だとうまくジャンプできないかもしれません。


☆10.C++ のコード補完を行う

clang_complete を使用して、Vim 上で、VisualStudio の IntelliSense の様なコード補完を行うことが出来ます。
設定などを説明すると日が暮れるので、下記を参照してください。
Windows 環境だと苦行かもしれません……。


[外部ツール]

  • clang

[プラグイン]


[参照]
https://github.com/Rip-Rip/clang_complete/wiki
http://d.hatena.ne.jp/osyo-manga/20110210/1297328933
http://d.hatena.ne.jp/osyo-manga/20110228/1298869326
[注意]
clang_complete と neocomplcache は月が吹っ飛ぶほど相性が悪いので注意してください。
デフォルトの設定だと、neocomplcache が機能しなくなってしまいます。

☆その他.Vim 上で実行デバッグを行う

Pyclewn という、ツール?プラグイン?を利用して、Vim 上で実行時デバッグを行うことが出来ます。
設定とか操作方法とか説明するのが手間なので、下記を参照してください。


[参照]
http://d.hatena.ne.jp/osyo-manga/20110307/1299451516

まとめ

と、まぁこんな感じの環境で、C++ のコーディングを行っています。
コーディングを行うだけなら、ほぼストレスフリーの環境に仕上がったと思っているので、個人的にはかなり満足しています。
Vim 的な操作はまだまだ覚えることが多いですが、環境自体はほぼこれで完成かな?
基本的にショートコーディングが多いので、大規模開発だとまた違ってくるのかもしれません。
特に VisualStudio との連携は全然やっていませんね……ここら辺は、Vim 以外にも問題があるんですが。
コーディングは、Vim で満足しているんですが、実行時デバッグは、まだ VisualStudio に依存しそうです。
あと grep とかも全然使っていないので、もっと使わねば。


そんな感じで、晒し終了。
もし他にも、『こんな機能/プラグインを使えば、効率が上がるぜー!!』みたいなのがあれば教えてください。


[追記]
リンク先が間違っていたりしたのを修正。