vimプラグイン改造ネタ2本+α

普段から愛用しているvimプラグインにわずかながら不満点があったので、現実逃避に暇を見つけてカスタマイズしてみた。

svn.vim

http://www.vim.org/scripts/script.php?script_id=978


これはsvnのコメント編集時に自動的に画面を分割してコミット内容とリポジトリのdiffを表示してくれる気の利いたプラグイン
svnのエディタにvimを使っている人におすすめ。


ただ、肝心のsvn diffを実行する部分が↓のように書かれているのでWindowsだと動かないという問題がある。

    exe 'normal :r!LANG=C svn diff ' . list_of_files . "\n"

Windowsコマンドプロンプトはこのように環境変数を設定して実行、みたいなことはできないのでとりあえずはLANG=Cの部分を削除して使っていたのだが、svnはCP932の日本語でメッセージを出してくるので、ソースコードUTF-8だったりすると文字化けして悲しい状態だったりする。


そこで、なんか無理矢理な感じだけどWindowsでもLANG=Cで実行するように書き換えてみた。

    if has('win32')
        let l:oldlang = $LANG
        let $LANG = 'C'
        exe 'normal :r!svn diff ' . list_of_files . "\n"
        if strlen(l:oldlang)
            let $LANG = l:oldlang
        else
            let $LANG =
        endif
    else
        exe 'normal :r!LANG=C svn diff ' . list_of_files . "\n"
    endif

きちんとLANGの後片付けが出来てるのか自信がないが、出来てなくてもぶっちゃけどうでもいいやとか思ったり。

commentout.vim

http://nanasi.jp/articles/vim/commentout_source.html


コメントアウトスクリプトは色々あるけど、ごてごてしたのよりもこのぐらいシンプルな方が好み。
filetypeや選択範囲で自動的に処理してくれるよりも自分で選びたい。


ただ、"/(最終検索パターン用レジスタ)が汚染されてしまうので、最近はあまり使ってなかった。
しかし<C-V>で縦にまとめて挿入とかだるすぎるのでなんとかならないものかと考えてみた。


動作の特性上やむを得ないのか、他のコマンドみたいに使用するレジスタを指定できるような感じではなかったので、別の場所に待避して後で戻すというベタな方法にしてみた。

" lhs comments
vmap ,# :<C-W>let @s=@/ \| '<,'>s/^/#/ \| let @/=@s \| nohlsearch<CR>
vmap ,/ :<C-W>let @s=@/ \| '<,'>s/^/\/\// \| let @/=@s \| nohlsearch<CR>
vmap ,> :<C-W>let @s=@/ \| '<,'>s/^/> / \| let @/=@s \| nohlsearch<CR>
vmap ," :<C-W>let @s=@/ \| '<,'>s/^/\"/ \| let @/=@s \| nohlsearch<CR>
vmap ,% :<C-W>let @s=@/ \| '<,'>s/^/%/ \| let @/=@s \| nohlsearch<CR>
vmap ,! :<C-W>let @s=@/ \| '<,'>s/^/!/ \| let @/=@s \| nohlsearch<CR>
vmap ,; :<C-W>let @s=@/ \| '<,'>s/^/;/ \| let @/=@s \| nohlsearch<CR>
vmap ,- :<C-W>let @s=@/ \| '<,'>s/^/--/ \| let @/=@s \| nohlsearch<CR>
vmap ,c :<C-W>let @s=@/ \| '<,'>s/^\/\/\\|^--\\|^> \\|^[#"%!;]// \| let @/=@s \| nohlsearch<CR>

" wrapping comments
vmap ,* :<C-W>let @s=@/ \| '<,'>s/^\(.*\)$/\/\* \1 \*\// \| let @/=@s \| nohlsearch<CR>
vmap ,( :<C-W>let @s=@/ \| '<,'>s/^\(.*\)$/\(\* \1 \*\)/ \| let @/=@s \| nohlsearch<CR>
vmap ,< :<C-W>let @s=@/ \| '<,'>s/^\(.*\)$/<!-- \1 -->/ \| let @/=@s \| nohlsearch<CR>
vmap ,d :<C-W>let @s=@/ \| '<,'>s/^\([/(]\*\\|<!--\) \(.*\) \(\*[/)]\\|-->\)$/\2/ \| let @/=@s \| nohlsearch<CR>

" block comments
vmap ,b <ESC>`<<S-O><ESC>0<S-D>i/*<ESC>`>o<ESC>0<S-D>i*/<ESC>
vmap ,h <ESC>`<<S-O><ESC>0<S-D>i<!--<ESC>`>o<ESC>0<S-D>i--><ESC>

変数のスコープがいまいちわからなくて(関数じゃないのでbが一番狭い?)、下手に汚染するよりはと思って適当なレジスタを使ってみた。
ちゃんとやるなら関数にしたほうがいいかもしれない……。


あとブロックコメントの挙動が微妙だったのでついでに変更した。
行選択だとうまくいかなかったのと、ファイルの先頭と末尾でうまく囲めなかったのを修正。
もう少しスマートな方法はないのかと思いつつ、まぁこれでいいや。

バッファが空っぽかどうか

おまけ。
最近PHPのコードを書くときはほぼUTF-8なんだけど、新規ファイルはいちおうロケールに合わせたかった(=WindowsだとCP932)ので、ftpluginでUTF-8にしてみた。


既存のファイルを開いたときはそっとしておいてほしいので、真っさらかどうかで判定しようと思ったんだけど、バッファサイズを得る方法が意外にもわからなかったorz
読み込んでstrlenとかするのは無駄なメモリ食いそうで嫌だし……ってことで組み込み関数を片っ端から眺めて使えそうだと思ったのがgetpos()関数だった。
これでファイルの末尾=一行一桁目なら空っぽってことで。もっといい方法があれば教えてくだちい。

ftplugin/php.vim

"setl ts=2 sw=2 sts=2 et
compiler php
setl makeprg=php\ -l\ %
nmap <F11> :make<CR>:cw<CR><CR>
au! BufWritePost <buffer> silent make

let s:pos = getpos('$')
if s:pos[1] == 1 && s:pos[2] == 1
  set fenc=utf-8
  set ff=unix
  WTemplate
endif

WTemplateはbwTemplateっていうテンプレート系のプラグイン
これで<?php 〜 ?>とかコメントとかを読み込んでいる。


前半の部分はflymakeっぽい感じで保存時にsyntax checkする設定。
Windowsだと一瞬コマンドプロンプトが出るのでうざいことこの上ない。