vimでPythonのコードを書いているときにflymake?っぽい感じをだす

Vim環境でPythonコードのflymakeっぽいことをしたかったのですが、 これといった決め手となる記事がなくて苦労したので、 メモを残しておきます。 (どなたか既存の記事をご存知であれば、教えてください。)

準備

まずPythonのlintライクなツールとしては、 PyCheckerPylintPyFlakes が有名です。

それぞれのモジュールに対するまとまった記事としては、以下が参考になります。

python 用 lint、Pyflakes vs. pyChecker vs. pylint - 傀儡師の館.Python - 楽天ブログ(Blog)

Ubuntu Linuxではapt-getで簡単にインストールできました。 (easy_install経由等でも簡単にインストール可能だと思います。)

$ sudo apt-get install pychecker
$ sudo apt-get install pylint
$ sudo apt-get install pyflakes

各ツールをvimと連携させる

以下の記事を参考にPython用の設定を模索してみました。

errormarker.vim で flymake(Emacsの) る - 8時40分が超えられない - subtech

pylintは設定ファイルがないと警告を出すので適当なところに設定ファイルを 置いて [1] 、コマンドオプションに指定します。また警告等のメッセージのみ出力させたいので、 「reports=no」に設定を変えておきます。

""" $HOME/.vim/ftplugin/python/flyquickfixmake.vim
""" setting for pylint
setlocal makeprg=/usr/bin/pylint\ --rcfile=$HOME/.pylint\ -e\ %
setlocal errorformat=%t:%l:%m

if !exists("g:python_flyquickfixmake")
    let g:python_flyquickfixmake = 1
    au BufWritePost *.py make
endif
$ pylint --generate-rcfile > ~/.pylint
$ diff -u pylint.config-org /home/hattori/.pylint
--- pylint.config-org   2009-06-29 00:49:16.000000000 +0900
+++ /home/hattori/.pylint       2009-06-29 00:48:07.000000000 +0900
@@ -71,7 +71,8 @@
 files-output=no

 # Tells wether to display a full report or only the messages
-reports=yes
+###reports=yes
+reports=no

 # Python expression which should return a note less than 10 (10 is the highest
 # note). You have access to the variables errors warning, statement which

pyflakesを利用する場合は、flyquickfixmake.vimを以下のようにします。

""" $HOME/.vim/ftplugin/python/flyquickfixmake.vim
""" setting for pyflakes
setlocal makeprg=/usr/bin/pyflakes\ %
setlocal errorformat=%f:%l:%m

if !exists("g:python_flyquickfixmake")
    let g:python_flyquickfixmake = 1
    au BufWritePost *.py make
endif

pycheckerはPython2.6に対応していないためか、エラーを大量に出力したため 使用をあきらめました。

設定が終われば、Pythonのコードをvimで開いて、保存したときにコードチェックが 行われるようになります。

使用感

pylintは重厚なツールで一回のチェックが長いです。 ただしPEP8ベースの構文チェックも行えるので、それを利用したいのであれば 唯一の選択肢となります。外部に公開するようなモジュールのコードチェックに 使用するのがよいのではないでしょうか。

pycheckerは依存するモジュールまでチェックしているようで、 求めているものとは違っていました。(深追いしていないので、私の認識が おかしいだけかもしれません。ただ単にPython2.6だからエラーはいてたのかも。)

pyflakesは動作が軽く、インタプリタ言語でlintライクな チェックを行うのにはちょうど良いのではないでしょうか。 私が求めていたものに一番近かったので、今後はこれを使っていこうと思います。

くわしくは調べていませんが、 pyflakes.vimというスクリプト もあるみたいです。

vim:QuickFixのめも

:cn     " 次のエラーへジャンプ
:cp     " 前のエラーへジャンプ
:cope   " QuickFixリストを表示
:ccl    " QuickFixリストを閉じる

Vim documentation: quickfix

footnote

[1](2009-07-04追記) 設定ファイルは $HOME/.pylintrc に置けば良いですね。