ton-tech-ton

vimでpythonのコーディングスタイルを自動でチェック&自動修正する

python, vim

PythonにはPEP8 (日本語訳)という 公式のコーディングスタイルあります。 どうせならちゃんとコーディングスタイルに沿った綺麗なコードが書きたいですよね。

ということでvimでPythonコードがPEP8に従っているか自動的にチェック、修正するようにします。

PEP8のチェック

PEP8に従っているかチェックするにはpep8という、そのままの名前のツールを使います。

pep8 – Python style guide checker

おまけとしてpyflakesという、文法チェックや未使用なimportや変数を教えてくれる便利なツールも入れときます。

pyflakes – passive checker of Python programs

インストールはpipで。

1
pip install pep8 pyflakes

ちなみに、pep8とpyflakesを合体したような、flake8というツールもあります。

flake8 – the modular source code checker: pep8, pyflakes and co

これを使ってもいいのですが、自分の環境では少々重かったのでやめました。

全然重くねーじゃん!という方は、これから説明するvimでのチェックにflake8を指定するだけで簡単に切り替えられます。

vimで自動的にチェック

vimで上記のツールを自動的に実行させるには、syntasticというツールを使います。

scrooloose/syntastic – Syntax checking hacks for vim

こいつはPythonに限らずいろんな言語の文法チェックを自動的に行なってくれる優れものなので 入れといて損はないはず。

インストールはNeoBundleを使っている場合はvimrcに一行書くだけ。

1
NeoBundle 'scrooloose/syntastic'

syntasticでpep8, pyflakesを使うには以下のような設定にします。

1
let g:syntastic_python_checkers = ['pyflakes', 'pep8']

これでファイルを保存した時に自動的にpyflakesとpep8でチェックしてくれます。

自動修正する

コーディングスタイルを自動的にチェックしてくれるのはいいんだけど、修正するのめんどくさい・・・ という人のために自動修正してくれるツールもあります。 その名もautopep8。

autopep8 – A tool that automatically formats Python code to conform to the PEP 8 style guide

インストールはpipから。

1
pip install autopep8

これをvimで使うには、以下の設定をコピペしてください。

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
" original http://stackoverflow.com/questions/12374200/using-uncrustify-with-vim/15513829#15513829
function! Preserve(command)
    " Save the last search.
    let search = @/
    " Save the current cursor position.
    let cursor_position = getpos('.')
    " Save the current window position.
    normal! H
    let window_position = getpos('.')
    call setpos('.', cursor_position)
    " Execute the command.
    execute a:command
    " Restore the last search.
    let @/ = search
    " Restore the previous window position.
    call setpos('.', window_position)
    normal! zt
    " Restore the previous cursor position.
    call setpos('.', cursor_position)
endfunction

function! Autopep8()
    call Preserve(':silent %!autopep8 -')
endfunction

" Shift + F で自動修正
autocmd FileType python nnoremap <S-f> :call Autopep8()<CR>

Preserve関数でごにょごにょしてるのは、修正前と修正後でなるべくカーソルの位置を保つようにするためのものです。 オリジナルはstackoverflowのUncrustifyについての回答で、そのまま使わせてもらっています。

Using Uncrustify with VIM – Stack Overflow

<S-f>のところは好きなキーに変えてください。

自動修正すると問答無用で変更されるので、ちゃんとgitなどで管理して修正を確認するようにしてください。

Before After

ここまで書いておいてあれですが、vim-autopep8という、プラグインもありますw

tell-k/vim-autopep8

自分の環境では実行すると描画がおかしくなってしまったので、自分で書いちゃったのですが、 こっちのプラグインを先に試してみる方がいいかもしれません。

設定

PEP8に完璧に従うことができればいいのですが、なかなか難しいものです。 特に80桁制限。こういう警告が出ないようにするにはそれぞれのツールで設定してやる必要があります。

pep8での設定

pep8のツールでは、~/.config/ディレクトリの中にpep8というファイルを作ってその中に設定を書けばおkです。 下記の例は80桁制限を100桁にする例です。

~/.config/pep8
1
2
[pep8]
max-line-length = 100

他の設定については公式のドキュメントを参照してください。

pep8 documentation – Configuration

autopep8での設定

pep8で警告が出なくなってもautopep8の設定をしないと自動修正されてしまいます。 設定はautopep8の引数に設定していきます。

私は桁制限の警告が出ても勝手に改行されるのが嫌だったので桁制限を無視するよう設定しています。

1
2
3
function! Autopep8()
    call Preserve(':silent %!autopep8 --ignore=E501 -')
endfunction

最後のハイフン-は標準入力からコード受け取るという意味なので忘れないでください。

その他の設定は最初に載せたURLのREADMEに載っています。

これでPEP8に沿ったコードが簡単に書けるようになりました。 それでは良いPythonライフを!

Comments