外部コマンド
文法チェックをしたり pep8 に準拠するような作法に整えたりするために Pythonスクリプトをチェックするコマンドとしては pytest が便利です。
pytest本体ではpep8までチェックできませんが、 pytest-pep8 も入れる事でpep8についてまでチェックできる様になります。
$ pip install pytest-pep8
で必要な物を全てインストールしてくれます(pep8やpytest等)。
使い方は
$ py.test --pep8 target.py
等と、.pyファイルを与えるかディレクトリを与えると そのディレクトリ内の.pyファイル全てをチェックします。 (何も与えないとカレントディレクトリのチェック)
1 2 3 4 |
|
こんな感じのスクリプトに試してみます。
こんな感じで明らかに文法ミスの2
3
の間の,
の忘れに加え、
for
文内がインデントが2しかないことについてpep8違反ということで報告されます。
pytestがちょっと面倒な所は、 .pyで終わらないファイルをチェックするのが面倒な所。 (出来ないことはないけどわざわざ設定ファイルを書かないとダメ?)
それから、実行したディレクトリにキャッシュ用のディレクトリ(__pycache__) を作ってしまう所。
ちょっとチェックだけしたいときにこの辺りが結構使いづらいです。 (上手くやる方法もあるのかもしれませんが。)
Vim
シンタックスハイライト等
hdima/python-syntax 等、いくつかシンタックス用のプラグインもありますが、 取り敢えず表示用にはデフォルトのままで十分かな、と言う感じがします。
一方で、文法チェックなどを osyo-manga/vim-watchdogs を使って表示させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
文法チェックではwatchdogsデフォルトではpyflakes
を使うようになってますが、
ここではflake8
が入ってたらfalke8
を使うようにしています。
$ pip install flake8
で入れておくか、もしくはどこでもインストールして良いのなら、
1 2 3 4 5 6 7 |
|
みたいにしておいてMac/Cygwin/Linux環境では必要なら自動でpip install
する
様にしておくことも出来ます。
以前は scrooloose/syntastic を使ってましたが、 watchdogsの方が暫く時間が経つと勝手にチェックしてくれたりする様にも出来るので便利です。
また、
nvie/vim-flake8
(nvie/vim-pyflakes+nvie/vim-pep8)
という物もあって、こちらはflake8
等を手動で走らせる事が出来る様になる
プラグインです。
汎用的なwatchdogsとかがあれば特に必要ないですが、
Pythonだけに特化してるならこちらを使っても良いかもしれません。
インデント
デフォルトのインデントも4つなんですが、 特に括弧をつないだまま次の行へ行くようなときに pep8に従わないインデントになってしまいます。
1 2 |
|
Pythonでは()
が閉じない限りは上のように次の行に行っても同一行として
認識してくれますが、この様な場合、arg2,
の所でReturnすると、
上のarg3
の所(4x2=8文字下げ)にインデントされて表示されます。
pep8ではこの様な場合、arg1
の位置と揃えるようにインデントするのが正しいとされます。
1 2 |
|
こんな感じに。
これをきちんとやってくれるプラグインとして、 hynek/vim-python-pep8-indent があります。
1
|
|
これで毎回自動でpep8準拠なインデントにしてくれます。
また、 nathanaelkane/vim-indent-guides というプラグインを使うとインデント部分をハイライトしてくれるので、 特にPythonの時には便利です。
1 2 3 4 5 6 7 8 9 |
|
こんな感じで設定しておくと、
こんな感じで左側のスペースを4文字ずつ(言語ごとに設定されてるインデントずつ) 色を変えて表示してくれます。
補完
基本は Shougo/neocomplete.vim で行います。
1 2 3 4 5 6 7 8 9 |
|
Neocomplete自体の設定は長いので今回は省略(full .vimrc)。
上ではcompleteopt-=preview
だけ設定しています。
これはOmni補完するときに、関数の説明などを小窓を開いて説明するのを辞める設定です。
便利な機能ですが、補完毎に表示されると結構邪魔です。
特に、選択しようと候補を移動するときに、説明の量が違うので、
小窓の大きさがちょこちょこ変わって全体の表示が大変なことになるので
普段はOFFっておいた方が良いと思います。
NeocompleteではVimにデフォルトで入っている pythoncomplete.vim を使ってOmni補完をしてくれます。
これをJedi に変更することも出来ます。
davidhalter/jedi-vim というプラグインがあるのでこれを入れて設定を行えばOK。
jedi
自体は自分で入れてもよいですが、このプラグインを入れると
プラグインのディレクトリ内に自動でインストールされる様にもなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
以前はjedi-vimのちょっとした不具合があって、
開発版のdev
ブランチの方を使うと上手く行った1
なんてこともありましたが、
現状はmaster
ブランチの方が最近の更新が見えますし、
master
を普通に使えばOK。
Jedi自体の他の設定は余り使いこなしてませんが、 Omni補完に関してだけでもJediのが良さげ だったりするので出来れば入れておきたい所です。
畳み込み
関数単位等畳み込み(folding)するためのプラグインとして vim-scripts/python_fold があります。
これはpluginディレクトリにファイルが置かれていて、 かつファイル内でPythonかどうか、みたいなチェックもないので、 これをインストールすると全てのファイルタイプに影響が出てしまいます。
ので、NeoBundleとかでインストールする場合には
1 2 |
|
こんな感じでPython系な場合だけ読み込む様にします。
同じようなプラグインで vim-scripts/jpythonfold.vim というのもありますが、こちらはsyntaxディレクトリにファイルが置いてあって、 名前がjpythonfold.vimなので、このままではPythonファイルの時にも 読み込まれません。
なので使うときはここへのパスを追加するなりファイル名を変更するなり 別の所に突っ込むなりしないといけません。
python_foldと大体同じ時期に開発は止まっていて(5年位前。。。) 特にどちらというわけでもないので畳み込みを使いたいときはpython_foldの 方で良いかな、と言う感じです。
ただ、畳み込みは結構負荷がかかるので、環境や普段編集するPythonファイルの 大きさなどによっては編集時にストレス感じるほど遅くなる場合があります。 ので使ってみて使用感次第で。
1年位前に使ってみて物凄く遅くて使い物にならなかった感じがしましたが、 今、手元のMacだとかなり大きなファイルを開いても結構快適に動いています。
ただ、やはり環境によっては遅いので、通常はOFFにしておくかな、と言う感じです。