rcmdnk's blog

Learning Python

Python用の環境設定について最近更新したので経過メモ。 特にVimのプラグインとかについて。

外部コマンド

文法チェックをしたり 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

こんな感じのスクリプトに試してみます。

pytest

こんな感じで明らかに文法ミスの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する 様にしておくことも出来ます。

watchdogs

以前は 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

こんな感じで設定しておくと、

indent

こんな感じで左側のスペースを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系な場合だけ読み込む様にします。

folding

同じようなプラグインで vim-scripts/jpythonfold.vim というのもありますが、こちらはsyntaxディレクトリにファイルが置いてあって、 名前がjpythonfold.vimなので、このままではPythonファイルの時にも 読み込まれません。

なので使うときはここへのパスを追加するなりファイル名を変更するなり 別の所に突っ込むなりしないといけません。

python_foldと大体同じ時期に開発は止まっていて(5年位前。。。) 特にどちらというわけでもないので畳み込みを使いたいときはpython_foldの 方で良いかな、と言う感じです。

ただ、畳み込みは結構負荷がかかるので、環境や普段編集するPythonファイルの 大きさなどによっては編集時にストレス感じるほど遅くなる場合があります。 ので使ってみて使用感次第で。

1年位前に使ってみて物凄く遅くて使い物にならなかった感じがしましたが、 今、手元のMacだとかなり大きなファイルを開いても結構快適に動いています。

ただ、やはり環境によっては遅いので、通常はOFFにしておくかな、と言う感じです。

Sponsored Links
Sponsored Links

« Pythonの対話モードの履歴を残す方法 Macでdefaultsコマンドで設定出来るオプションを調べる »

}