C/C++やObjective-Cのコードをいい感じに整形してくれるUncrustify、最近気に入ってて使ってます。
んでこれをvimで使おうと思って設定したんだけどなんかいい感じにならない。
例えば外部コマンドを使ってフォーマットするformatprgを使って
Vim Script
:setformatprg=uncrustify\ -c\ ~/misc/uncrustify.cfg\ -l\ CPP\ --no-backup\ 2>/dev/null
こんな感じで設定して、gqで現在の行をフォーマット、ggVGで全選択してからgqで全体をフォーマットできます。
だけどuncrustifyは前後関係を見てうまいこと整形してくれるから1行だけフォーマットなんてしないし、ggVGで全選択するとさっきいた行まで戻るのがめんどい。
もっといい感じにできないかなーと思って探してたら、ありました。
Using Uncrustify with VIM - Stack Overflow
このAnswerのコード。フォーマットしたあと位置を復元してくれるので、めっちゃ便利。
これだ!と思ってちょろっと改変して、言語を自動検出して自動的に言語毎の設定でフォーマットするようにしました。
以下のコード
Vim Script
"----------------------------------------" uncrustify"----------------------------------------" see http://stackoverflow.com/questions/12374200/using-uncrustify-with-vim/15513829#15513829" 例: Shift-Fでコードのフォーマットを行う.nnoremap<S-f> :call UncrustifyAuto()<CR>" 例: 保存時に自動フォーマット" autocmd BufWritePre <buffer> :call UncrustifyAuto()" uncrustifyの設定ファイルletg:uncrustify_cfg_file_path ='~/.uncrustifyconfig'" uncrustifyでフォーマットする言語letg:uncrustify_lang =""
autocmd FileTypecletg:uncrustify_lang ="c"
autocmd FileType cpp letg:uncrustify_lang ="cpp"
autocmd FileType java letg:uncrustify_lang ="java"
autocmd FileType objc letg:uncrustify_lang ="oc"
autocmd FileTypecsletg:uncrustify_lang ="cs"" Restore cursor position, window position, and last search after running a" command.function! Preserve(command)" Save the last search.let search = @/
" Save the current cursor position.let cursor_position = getpos('.')" Save the current window position.
normal! H
let window_position = getpos('.')call setpos('.', cursor_position)" Execute the command.
execute a:command
" Restore the last search.let @/ = search
" Restore the previous window position.call setpos('.', window_position)
normal! zt
" Restore the previous cursor position.call setpos('.', cursor_position)endfunction" Don't forget to add Uncrustify executable to $PATH (on Unix) or" %PATH% (on Windows) for this command to work.function! Uncrustify(language)call Preserve(':silent %!uncrustify'.' -q '.' -l '.a:language.' -c '.
\shellescape(fnamemodify(g:uncrustify_cfg_file_path,':p')))endfunctionfunction! UncrustifyAuto()ifg:uncrustify_lang !=""call Uncrustify(g:uncrustify_lang)endifendfunction
うまいことでけた!満足
他にもっと良い感じにできるよーて人がいれば教えて下さい