外部コマンド
文法チェックをしたり
pep8
に準拠するような作法に整えたりするために
Pythonスクリプトをチェックするコマンドとしては
pytest
が便利です。
pytest本体ではpep8までチェックできませんが、
pytest-pep8
も入れる事でpep8についてまでチェックできる様になります。
$ pip install pytest-pep8
で必要な物を全てインストールしてくれます(pep8やpytest等)。
使い方は
$ py.test --pep8 target.py
等と、.pyファイルを与えるかディレクトリを与えると
そのディレクトリ内の.pyファイル全てをチェックします。
(何も与えないとカレントディレクトリのチェック)
test.py
1
2
3
4
| #!/usr/bin/env python
for a in [1, 2 3]:
print a
|
こんな感じのスクリプトに試してみます。

こんな感じで明らかに文法ミスの23の間の,の忘れに加え、
for文内がインデントが2しかないことについてpep8違反ということで報告されます。
pytestがちょっと面倒な所は、
.pyで終わらないファイルをチェックするのが面倒な所。
(出来ないことはないけどわざわざ設定ファイルを書かないとダメ?)
Changing standard (Python) test discovery
それから、実行したディレクトリにキャッシュ用のディレクトリ(__pycache__)
を作ってしまう所。
ちょっとチェックだけしたいときにこの辺りが結構使いづらいです。
(上手くやる方法もあるのかもしれませんが。)
Python のコーディング規約 PEP8 に準拠する - Qiita
Vim
シンタックスハイライト等
hdima/python-syntax
等、いくつかシンタックス用のプラグインもありますが、
取り敢えず表示用にはデフォルトのままで十分かな、と言う感じがします。
一方で、文法チェックなどを
osyo-manga/vim-watchdogs
を使って表示させています。
.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| NeoBundle "osyo-manga/vim-watchdogs", {
\ "depends": ["Shougo/vimproc", "thinca/vim-quickrun", "dannyob/quickfixstatus",
\"osyo-manga/shabadou.vim", "cohama/vim-hier"]}
if ! empty(neobundle#get("vim-watchdogs"))
let g:watchdogs_check_BufWritePost_enable = 1
let g:watchdogs_check_CursorHold_enable = 1
if !exists("g:quickrun_config")
let g:quickrun_config = {}
endif
let g:quickrun_config["watchdogs_checker/_"] = {
\ "outputter/quickfix/open_cmd" : "",
\ "runner/vimproc/updatetime" : 50,
\ "hook/qfsigns_update/enable_exit": 1,
\ "hook/qfsigns_update/priority_exit": 3,
\}
let s:flake8 = system('flake8 --version 2>/dev/null')
if s:flake8 != ""
let g:quickrun_config["python/watchdogs_checker"] = {
\ "type" : "watchdogs_checker/flake8"
\}
endif
call watchdogs#setup(g:quickrun_config)
endif
|
文法チェックではwatchdogsデフォルトではpyflakesを使うようになってますが、
ここではflake8が入ってたらfalke8を使うようにしています。
$ pip install flake8
で入れておくか、もしくはどこでもインストールして良いのなら、
.vimrc
1
2
3
4
5
6
7
| NeoBundle "osyo-manga/vim-watchdogs", {
\"build": {
\"mac": ["pip install flake8"],
\"cygwin": ["pip install flake8"],
\"linux": ["pip install flake8"]},
\"depends": ["Shougo/vimproc", "thinca/vim-quickrun", "dannyob/quickfixstatus",
\"osyo-manga/shabadou.vim", "cohama/vim-hier"]}
|
みたいにしておいてMac/Cygwin/Linux環境では必要なら自動でpip installする
様にしておくことも出来ます。

以前は
scrooloose/syntastic
を使ってましたが、
watchdogsの方が暫く時間が経つと勝手にチェックしてくれたりする様にも出来るので便利です。
また、
nvie/vim-flake8
(nvie/vim-pyflakes+nvie/vim-pep8)
という物もあって、こちらはflake8等を手動で走らせる事が出来る様になる
プラグインです。
汎用的なwatchdogsとかがあれば特に必要ないですが、
Pythonだけに特化してるならこちらを使っても良いかもしれません。
vim-watchdogsで快適なシンタックスチェック - Blank File
インデント
デフォルトのインデントも4つなんですが、
特に括弧をつないだまま次の行へ行くようなときに
pep8に従わないインデントになってしまいます。
1
2
| def myfunc(arg1, arg2,
arg3):
|
Pythonでは()が閉じない限りは上のように次の行に行っても同一行として
認識してくれますが、この様な場合、arg2,の所でReturnすると、
上のarg3の所(4x2=8文字下げ)にインデントされて表示されます。
pep8ではこの様な場合、arg1の位置と揃えるようにインデントするのが正しいとされます。
1
2
| def myfunc(arg1, arg2,
arg3):
|
こんな感じに。
これをきちんとやってくれるプラグインとして、
hynek/vim-python-pep8-indent
があります。
.vimrc
1
| NeoBundle "hynek/vim-python-pep8-indent"
|
これで毎回自動でpep8準拠なインデントにしてくれます。
また、
nathanaelkane/vim-indent-guides
というプラグインを使うとインデント部分をハイライトしてくれるので、
特にPythonの時には便利です。
.vimrc
1
2
3
4
5
6
7
8
9
| NeoBundle "nathanaelkane/vim-indent-guides"
if ! empty(neobundle#get("vim-indent-guides"))
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_start_level = 1
let g:indent_guides_auto_colors = 0
autocmd MyAutoGroup VimEnter,Colorscheme * hi IndentGuidesEven term=bold ctermfg=9 ctermbg=235
autocmd MyAutoGroup VimEnter,Colorscheme * hi IndentGuidesOdd term=bold ctermfg=9 ctermbg=239
endif
"}}} vim-indent-guides
|
こんな感じで設定しておくと、

こんな感じで左側のスペースを4文字ずつ(言語ごとに設定されてるインデントずつ)
色を変えて表示してくれます。
補完
基本は
Shougo/neocomplete.vim
で行います。
.vimrc
1
2
3
4
5
6
7
8
9
| if has('lua') && (( v:version == 703 && has('patch885')) || (v:version >= 704))
let g:completion = "Shougo/neocomplete.vim"
NeoBundleLazy g:completion, {
\ "autoload": {"insert": 1 }}
endif
if ! empty(neobundle#get("neocomplete.vim"))
autocmd FileType python setlocal completeopt-=preview
endif
|
Neocomplete自体の設定は長いので今回は省略(full .vimrc)。
上ではcompleteopt-=previewだけ設定しています。
これはOmni補完するときに、関数の説明などを小窓を開いて説明するのを辞める設定です。
便利な機能ですが、補完毎に表示されると結構邪魔です。
特に、選択しようと候補を移動するときに、説明の量が違うので、
小窓の大きさがちょこちょこ変わって全体の表示が大変なことになるので
普段はOFFっておいた方が良いと思います。
NeocompleteではVimにデフォルトで入っている
pythoncomplete.vim
を使ってOmni補完をしてくれます。
これをJedi
に変更することも出来ます。
davidhalter/jedi-vim
というプラグインがあるのでこれを入れて設定を行えばOK。
jedi-vimとneocomplete.vimを併用する際に行っておきたい設定 - kozo2’s blog
jedi自体は自分で入れてもよいですが、このプラグインを入れると
プラグインのディレクトリ内に自動でインストールされる様にもなっています。
.vimrc
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 for python
NeoBundleLazy "davidhalter/jedi-vim", {
\ "autoload": { "filetypes": [ "python", "python3", "djangohtml"] }}
if ! empty(neobundle#get("jedi-vim"))
let g:jedi#auto_initialization = 1
let g:jedi#auto_vim_configuration = 1
nnoremap [jedi] <Nop>
xnoremap [jedi] <Nop>
nmap <Leader>j [jedi]
xmap <Leader>j [jedi]
let g:jedi#completions_command = "<C-N>"
let g:jedi#goto_assignments_command = "[jedi]g"
let g:jedi#goto_definitions_command = "[jedi]d"
let g:jedi#documentation_command = "[jedi]K"
let g:jedi#rename_command = "[jedi]r"
let g:jedi#usages_command = "[jedi]n"
let g:jedi#popup_select_first = 0
let g:jedi#popup_on_dot = 0
autocmd FileType python setlocal completeopt-=preview
" for w/ neocomplete
if ! empty(neobundle#get("neocomplete.vim"))
autocmd FileType python setlocal omnifunc=jedi#completions
let g:jedi#completions_enabled = 0
let g:jedi#auto_vim_configuration = 0
let g:neocomplete#force_omni_input_patterns.python =
\ '\%([^. \t]\.\|^\s*@\|^\s*from\s.\+import \|^\s*from \|^\s*import \)\w*'
endif
endif
|
以前はjedi-vimのちょっとした不具合があって、
開発版のdevブランチの方を使うと上手く行った1
なんてこともありましたが、
現状はmasterブランチの方が最近の更新が見えますし、
masterを普通に使えばOK。
Jedi自体の他の設定は余り使いこなしてませんが、
Omni補完に関してだけでもJediのが良さげ
だったりするので出来れば入れておきたい所です。
Vimを最強のPython開発環境にする2 - Λlisue’s blog
Big Sky :: python 補完のVimプラグイン「jedi-vim」がスゲー
畳み込み
関数単位等畳み込み(folding)するためのプラグインとして
vim-scripts/python_fold
があります。
これはpluginディレクトリにファイルが置かれていて、
かつファイル内でPythonかどうか、みたいなチェックもないので、
これをインストールすると全てのファイルタイプに影響が出てしまいます。
ので、NeoBundleとかでインストールする場合には
.vimrc
1
2
| NeoBundleLazy "vim-scripts/python_fold", {
\ "autoload": { "filetypes": [ "python", "python3", "djangohtml"] }}
|
こんな感じでPython系な場合だけ読み込む様にします。

同じようなプラグインで
vim-scripts/jpythonfold.vim
というのもありますが、こちらはsyntaxディレクトリにファイルが置いてあって、
名前がjpythonfold.vimなので、このままではPythonファイルの時にも
読み込まれません。
なので使うときはここへのパスを追加するなりファイル名を変更するなり
別の所に突っ込むなりしないといけません。
python_foldと大体同じ時期に開発は止まっていて(5年位前。。。)
特にどちらというわけでもないので畳み込みを使いたいときはpython_foldの
方で良いかな、と言う感じです。
ただ、畳み込みは結構負荷がかかるので、環境や普段編集するPythonファイルの
大きさなどによっては編集時にストレス感じるほど遅くなる場合があります。
ので使ってみて使用感次第で。
1年位前に使ってみて物凄く遅くて使い物にならなかった感じがしましたが、
今、手元のMacだとかなり大きなファイルを開いても結構快適に動いています。
ただ、やはり環境によっては遅いので、通常はOFFにしておくかな、と言う感じです。