vimからastyleを使ってコード整形
「コードフォーマッターとか俺の知らないもんなんぞ知ったことかぁぁぁぁぁ」とか考えて幾星霜。
そろそろいい加減コードの整形を意識しながら書いていくのも面倒くさくなってきたのでツールに頼る事にしました。
まずvimに備え付けの整形機能を使ったのですが、これだとQtのslotを利用している部分でインデントがおかしくなってしまい断念。
仕方ないので何かいいツールはないものかと探しているうちに
- GNU indent
- artistic style
- UniversalIndentGUI
の3つが候補に。
UniversalIndentGUIが設定項目が多いとの事なのでまず最初に手を出したのですが、使い方がさっぱり分からず断念。manで説明見ても肝心な部分が数行ってどうなのよ。
仕方ないのでアルファベット順でartistic style、通称astyleを使ってみる事に。
manページとにらめっこする事15分(多分)、使い方を理解することに成功。
以下のような設定ファイルを用意して整形の準備OK。
style=kr indent=tab=4 indent-namespaces indent-switches indent-classes brackets=linux #break-blocks pad=oper unpad=paren pad=paren-in
ここまででvimから:!astyle %でもいいのですが、整形前に保存しなければならない事と整形後の再読み込みが面倒なのでvimrcにマッピングの設定をしました。
nmap C :w<LF>:!astyle %<LF>:e!<LF> imap <C-j> <ESC>:w<LF>:!astyle %<LF>:e!<LF>a
これで再読み込みとか意識せずにコードの整形が出来るようになりました。
整形後にアンドゥ出来ないのが不便な事もありますが。
----- 12/3 20:11頃に追記 -----
コメント欄より『:{range}!{command}』と指定するとrangeに指定した範囲だけを外部コマンドでフィルタ出来るという事をお教え頂きました。
これを踏まえてvimrcへの設定を以下のようにすると整形前の保存も必要ないし、整形後のundoも可能になりました。
nmap C :%!astyle<LF> imap <C-j> <ESC>:%!astyle<LF>
内容もスッキリ見やすくなってとてもいい感じです。
ついでに挿入モードから整形を実行したらその後に移動をしたくなると思うので、コマンドモードに戻るようにしておきました。
----- 12/4 13:42頃に追記 -----
カーソル位置戻したりとか考えたら最終的にコマンドになりました。
:if exists("g:loaded_astyle") :finish :endif :let g:loaded_astyle = 1 :let s:save_cpo = &cpo :set cpo&vim :function Astyle() :let l:pos = getpos(".") :%!astyle :call setpos(".", pos) :endfunction :command Astyle :call Astyle() :let &cpo = s:save_cpo
astyle.vimで上記コードをpluginに保存して:Astyleで使ってます。