読者です 読者をやめる 読者になる 読者になる

vim で python を書いてる時に flake8 をいい感じに実行する

vim 素人の @tk0miya です。
いままで .vimrc が 1バイト(改行文字)しかないってバカにされていたんですが、ようやくその呪縛を解く時が来ました。

python のリントツールとしてよく使われている flake8 を編集時に実行しようと思っていろいろ調べました。
適当にぐぐってみると 3 つほど vim プラグインを見つけました。

それぞれ、2,3 分触った感触をまとめます。

vim-flake8

最初に見つけたやつです。
vim で python 開発するとき pyflakes + PEP8 = flake8 が便利 - 憧れ駆動開発 などで紹介されていました。

標準では F7 キーを押すと flake8 を実行するようになっています。

いちいち F7 を押すのはダルいので、README を参考に以下の設定をしておくと保存するときに flake8 を実行してくれます。

autocmd BufWritePost *.py call Flake8()

表示はこんな感じ。
f:id:tk0miya:20131212132738p:plain

雑感:

  • ふつうに使える
  • flake8 を同期的に実行しているせいなのか、保存するときに僅かにもたつきがある
  • 警告の一覧は別ウィンドウに表示する
    • 警告用に出てくるウィンドウは大きめ
    • すべての警告をクリアして保存するとウィンドウは勝手に消える

flake8-vim

同じ作者のものが https://github.com/vim-scripts/Flake8-vimhttps://github.com/andviro/flake8-vim
2箇所で公開されているでどっちか新しそうな方を使うといいと思います。
僕は前者で試しましたが、よく見ると後者の方が日付が新しいですね。
Python用のvimの設定 - memorandum などで紹介されていました。

こちらは特に設定せずとも、ファイル保存時に flake8 を実行してくれます。
表示はこんな感じ。
f:id:tk0miya:20131212133527p:plain
問題があった行の左側に EE というマークが付くようになります。

雑感:

  • ふつうに使える
  • vim-flake8 と比べると、保存時のもたつきが少ないように感じられる (気のせい?)
  • 警告の一覧は別ウィンドウに表示する
    • 警告の数に合わせて警告用ウィンドウの高さが抑えられている
    • すべての警告をクリアして保存するとウィンドウは勝手に消える
  • QuickFix って表示が出ているけど、:cnext でジャンプできなかった *1
  • 試している際、何度か警告が表示されなくなってしまうことがあった (vim を再起動したら復活)
    • 一度表示されなくなると、以降はもう表示されなくなってしまう印象

khuno

読み方がわかりませんが、k を読まずに ふーの と勝手に呼んでます。
日本語の紹介記事は見当たらず。

こいつは他の二つと異なり、flake8 を非同期実行するというのがポイントのようです。

I started this plugin because I am (was! ha!) pissed off at the alternatives. Most solutions require a blocking call to the checker program, you can't do anything else until that call ends.

That is unacceptable. I can't work like that. This plugin will not block while you work in Vim.

README を読むと Insert mode から抜けるときなどに flake8 を実行しているようです。
使った感じだとファイルを開いた時、保存した時などにも実行している模様。
Undo/Redo の時は実行しないので警告が残ってしまうことも。

表示はこんなかんじです。
f:id:tk0miya:20131212134914p:plain
警告ウィンドウを表示せず、問題箇所をハイライトさせます。

警告ウィンドウを表示したい場合は :Khuno show コマンドを実行すると良いようです。
ただし、このウィンドウは該当箇所をすべて直しても勝手に消えません。

雑感:

  • ふつうに使える
  • 非同期に flake8 を実行するのでもたつきは感じられない
  • 標準では警告の一覧は表示しないので見落としがありそう
    • :Khuno show を何かに割り当てるとよいのかも

まとめ

表示がシンプルでストレスの少ない khuno を使ってみることにします。
あまり警告を一覧表示することに重きを置いていないので*2
ハイライト表示だけというのも気軽でいいですね。

しばらく試してみることにします。

*1:quickfix 自体を普段使ってないので、設定不足なだけかも

*2:複数の Python に対応するには各バージョンで flake8 を実行する必要があるので、最終的なチェックは tox + CI にまかせて、編集のときは簡易チェックで構わないと考えました。