VimでPythonの入力補完・構文チェック・自動整形を行う

こちらは古い内容の記事です。現在はLanguage serverを使う方法が主流です。「vim-lsp」「coc.nvim」などで検索いただければと思います。

わかってる、わかってるんです。。時代はJupyter Notebook、PyCharmだということは。。だがしかしVimmer。

VimでPythonのコーディングもできたらと思い、入力補完、構文チェック、自動整形ができるように設定しました。

デバッグについてはもう少し改善が必要ですが、取り急ぎかなり良い環境になったので、情報をまとめます。

使用するプラグイン

  • valloric/youcompleteme…入力補完
  • nvie/vim-flake8…リンター
  • hhatto/autopep8…オートフォーマッター
  • vdebug…デバッガー

事前準備

youcompletemeはPythonで動作するので、必要に応じてパッケージをインストールする必要があります。

Ubuntuのdockerなど、ミニマムな環境では下記5つのパッケージが必要でした。

python3
python3-pip
build-essential
cmake
python3-dev

リンターやフォーマッターは下記のライブラリが必要なので、こちらも事前にインストールしておきます。

pip3 install flake8 autopep8

入力補完

youcompleteme は入力補完を実装するプラグインです。多くの言語で入力補完に対応しています。

リアルタイムでの補完も可能なのでコーディングがかなり捗るようになると思います。

コーディング能力向上のために敢えて入力補完を使わないスタイルを貫いている人もいますが、簡単にON/OFF切り替えもできるので、導入だけでもしておくのはありかなと思います。

youcompletemeのインストール

パッケージを導入後、youcompleteme内の install.py を実行します。bundleの配置場所は環境によって異なるので、適宜場所を確認してから実行します。

python3 /root/.vim/bundle/youcompleteme/install.py

下記は私が.vimrcに追記したyoucompleteme用の設定です。

let g:ycm_server_python_interpreter = '/usr/bin/python3'
let g:ycm_python_binary_path = '/usr/bin/python3'
let g:ycm_global_ycm_extra_conf = '/root/.vim/plugged/YouCompleteMe/.ycm_extra_conf.py'
let g:ycm_auto_trigger = 1
let g:ycm_min_num_of_chars_for_completion = 1
let g:ycm_autoclose_preview_window_after_insertion = 1
set completeopt-=preview
let g:ycm_add_preview_to_completeopt = 0

pythonのバイナリファイルの指定は、これも環境によって異なるので注意が必要。 g:ycm_auto_trigger = 1 でリアルタイムでの入力補完がONとなります。

構文チェック:リンター

vim-flake8 というプラグインで実装します。

flake8はPythonのリンターの一つ。下記のツールを内包したパッケージです。

  • PyFlakes
  • pycodestyle(PEP8)
  • Ned Batchelder’s McCabe script

PEP8とPyFlakesのチェック、それから循環的複雑度をチェックできます。

Vimのプラグインの設定にしたがってインストールすれば、そのまますぐに使用できる状態になります。

自動整形:フォーマッター

autopep8 を使います。PythonのコードをPEP8方式(pycodestyle)に自動でフォーマットしてくれるツールです。

リンターとフォーマッターの自動起動

ファイル保存時にリンターとフォーマッターを自動で起動できるよう、.vimrcに下記設定を追加しました。 :w でautopep8によるフォーマットが走ったあと、flake8による構文チェックが走ります。

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()
    "--ignote=E501: Ignore completing the length of a line."
    call Preserve(':silent %!!(MISSING)autopep8 --ignore=E501 -')
endfunction

augroup python_auto_lint
  autocmd!
  autocmd BufWrite *.py :call Autopep8()
  autocmd BufWrite *.py :call Flake8()
augroup END

デバッグ

今回、デバッグ用にVdebugというプラグインを試してみました。Python以外の言語にも対応しているので汎用性の高いプラグインです。

Pythonはpdbという標準のデバッガーがありますが、Vdebugではpydbgpというデバッグ用のツールを別途導入して使います。

こちらのサイト からpydbgpのパッケージをダウンロード、解答し、pythonのライブラリが置かれているディレクトリへコピーします。

wget http://downloads.activestate.com/Komodo/releases/11.1.0/remotedebugging/Komodo-PythonRemoteDebugging-11.1.0-91033-linux-x86_64.tar.gz
mkdir /usr/lib/python3/pydbgp
tar -C . -xzf Komodo-PythonRemoteDebugging-11.1.0-91033-linux-x86_64.tar.gz
mv Komodo-PythonRemoteDebugging-11.1.0-91033-linux-x86_64/* /usr/lib/python3/pydbgp/
mv /usr/lib/python3/pydbgp/python3lib/* /usr/lib/python3/pydbgp/

上記コマンドはpython3を使用している場合のコマンドです。

Komodo-PythonRemoteDebuggingのバージョンが8以上の場合は、python3lib(またはpythonlib)の中にあるdbgpディレクトとdbgp.clientを、pydbgpが置かれているディレクトリへ移動する必要があります。

ライブラリの場所は環境によって変わるので、適切な場所をあらかじめ確認して実行します。

pipでインストールすることもできるので、面倒な場合はそちらで試すのも良いかなと思います。

pip3 install komodo-python3-dbgp

デバッグの実行

デバッグを実行したいファイルをvimで開いて、F5を押下。その後、別ウィンドウでCLIを開き、下記コマンドを実行します。

python3 -S /usr/lib/python3/pydbgp/py3_dbgp -d localhost:9000 hogehoge.py

pydbgpのバイナリファイルへのパスを指定し、ファイルを実行しています。“No module named dbgp.client"というエラーが出たら、dbgp.clientの配置場所に問題があるので見直します。

コマンドが実行できたら、再びvimのウィンドウに戻り、F5を押下するとデバッガーが走ります。

結構手間なので、printデバッグの方が簡単かもしれません^^;

まとめ

ここで設定した内容はGitHubでまとめているので、ぜひご覧ください。dockerのコマンド一発で起動できるようにしています。

https://github.com/hodanov/docker-env-for-vim