clang-renameをVimからサクッと呼び出してC++のリネームを快適にする。

最近Go言語を使ってるんですが、この言語gofmtgorenamegoimportsなどのツールが充実していて良いですね。

C系の言語にも同じようなツールは存在します。

Welcome to Extra Clang Tools’s documentation! — Extra Clang Tools 5 documentation

この内clang-formatは既にVimプラグインが存在します。

C や C++ のコードを自動で整形する clang-format を Vim で - はやくプログラムになりたい

今回はclang-renameVimプラグインを作りました。
clang-renameは識別子をリネームするツールです。

github.com

clang-renameの導入

Arch

公式リポジトリからclang-tools-extraを入れましょう。

Ubuntu

clang-3.5以上のバージョンに含まれています。
ただしclang-renameのバージョンが古いと後述のqualified name機能が使えません。
この機能を使いたい場合はPPAなどからの導入を検討してください。
clang-rename --help-qualified-nameが表示されれば大丈夫です。

使い方

単一ファイルの場合:ClangRenameCurrent:ClangRenameQualifiedNameを使えば用が済むでしょう。

{new_name}を省略した場合は入力プロンプトが表示されます。

  • ClangRenameOffset [{offset} [{new_name}]]

オフセットを指定してリネームします。
例えばファイルの先頭のオフセットは0です。
-1を指定すると現在のカーソル位置をオフセットとして扱います。

  • ClangRenameCurrent [{new_name}]

カーソル位置のシンボル名を変更します。
内部でClangRenameOffsetを実行しています。

  • ClangRenameQualifiedName [{qualified_name} [{new_name}]]

シンボル名を指定してリネームします。
このコマンドを使うにはclang-rename-qualified-nameオプションをサポートしている必要があります。

  • ClangRename [...]

引数によって動作が変わります。
0個か1個ならClangRenameCurrentが実行されます。
2個ならClangRenameQualifiedNameが実行されます。

その他

  • <Plug>(clang_rename-current) ClangRenameCurrentのキーマップ
  • g:clang_rename#flags clang-renameの引数
  • g:clang_rename#compile_flags clang-renameが解析するときに使うコンパイルオプション(-std=c++11とか)

終わりに

実はclang extra toolsには標準でVimEmacs向けのスクリプトが付属してます。
ですが、微妙に使いづらかったので、このプラグインを作りました。