木曜日, 12月 24, 2009

pythontidyをvimで使うためのスクリプト

Pythonのコードフォーマッタといえば、pythontidy。
普通にコマンドとしても使えるわけですが、今書いているものに対して使用したいわけです。
で、私のメインエディタはvimなので、vimで使うにはどうすればいいか。

ただ使うだけならpythontidyにパスを通して:%! pythontidyでよい。普通はこれを適当なキーにマッピングしてやることになるはず。

ただpythontidyはsyntax errorのあるコードを受け付けないらしく、この方法ではsyntax errorが含まれているときに実行すると、エラーメッセージというかtracebackがバッファに書き込まれてしまう。uすれば戻るけど、うっかり:wqとかすると大変な事になる。

正常に動作した場合でもカーソルが一番上の行に移動してしまう。これはマークを設定してやれば回避できるけど面倒すぎる。

というわけで、pythontidyを使うためだけのvimスクリプトを書いてみた。
前提としてPYTHONPATHにpythontidyが入るようにしておくこと。
function! Pythontidy()
python << EOF
import tempfile
import vim
import pythontidy

cb = vim.current.buffer[:]
b = tempfile.TemporaryFile(mode="rb+")
out = tempfile.TemporaryFile(mode="rb+")
for l in cb[:]:
b.write(l + '\n')
b.seek(0)
pythontidy.tidy_up(b, out)
out.seek(0)
vim.current.buffer[:] = out.readlines()
EOF
endfunction

これをpython_tidy.vimという名前でもつけてあげて、ftpluginの下に置いてやる。
で、python.vimにmap <f5> :call Pythontidy()と書く。<f5>のところは任意のキーでいい。
これでsyntax errorを含むコードを食べさせても、インフォメーションメッセージにエラーが出てくる。ちゃんと動作したときも行の位置が変化しない。

これで安心してダラダラコーディングできる。

0 件のコメント: