読者です 読者をやめる 読者になる 読者になる

タオルケット体操

サツバツいんたーねっと

補完などを有効にしてVimを最高のPython用開発環境に進化させる

プログラミング Vim python

注意:NeoVimとかneocompleteとか

NeoVimの開発進行に伴い、多くのshougoware(neoシリーズ)も開発が終了して、闇の力をまとったなんかになっていってるっぽいです。
僕はNeoVim関係の情報をキャッチアップできていませんが、各プラグインに関してはREADMEやdocを読んでいって自己判断をやっていきましょう。


賛否あるでしょうが、Pycharm(IDEA)のような優れたPython用IDEがある現代においては、エディタのカスタマイズを全く行わないというのは生産性を犠牲にする行為であると筆者は考えています。

とはいえツールのセットアップというものはめんどくさいものです。IDEですら設定すべき箇所は多数あります。
今のところPython用Vimカスタマイズの設定例として個人的に満足するものがなかったのでブログにまとめておこうと思います。

Vim初心者だとわからない用語があったりするかもしれないのですが、Vim-jpだとかの解説記事を参考にしながら頑張ってください。

またキーバインドの設定というのは多分に属人的なものであるため、当記事においては一部を除いてキーバインド設定の例は記述しません。
どうしてもサンプルが欲しい場合は筆者のvimrcを参照してください。また各プラグインについては、基本的に:helpに設定例が存在するはずです。

https://github.com/hachibeeDI/dotfiles/blob/master/.vimrc

Vimのビルドオプション

Vimのコンパイルには多数のオプションがありますが、その中でもonにしておいた方が良いものは以下になります

  • python

    Pythonのライブラリを呼び出すようなプラグインの多くが利用しています。必須といってもいいです。

  • clipboard

    Vimの持っているレジスタの仕組みと、OSのクリップボードを連携出来るようになります。
    例えばMacに最初から入っているBSD由来のVimではこの機能がonになっていません。

  • lua or luajit

    NeoCompleteやUniteなどのShogowareを便利に使うには必要です。

vim --versionとすれば、どのオプションがonになっているのかがわかります。+pythonなどと表示されていればOKです。
ビルドの方法そのものについてはいくらでも情報があるので割愛します。

Linuxのディストリビューションなどによっては、古いVimしか配布していないものもあったりするのでなるべくなら自分でビルド出来るようになっておいた方が良いと思います。
でもMacの場合はhomebrew、Windowsの場合はKaoriya-Vimを使えばいいと思うよ。

以降、少なくとも7.4以降のバージョンのVimを使っているという前提で話を進めます。

基本的な.vimrcの設定

最低限、便利にするための設定が以下になります。個別の設定についていちいち説明はしませんが、なるべくならhelpをひいて意味を調べてください。

if &compatible
  set nocompatible
endif
filetype plugin indent on
syntax enable
set t_Co=256
set fileformats=unix, dos

set smarttab
set expandtab
set virtualedit=block

set ignorecase
set smartcase
set incsearch
set nohlsearch
set wrapscan

set list
set number
set listchars=tab:>-, trail:~

set ambiwidth=double
if has('path_extra')
    set tags& tags + =.tags, tags
endif
set laststatus=2
set showtabline=2

set clipboard=unnamed

set backspace=eol,indent,start

set wildmenu
set wildmode=list:full
set wildignore=*.o,*.obj,*.pyc,*.so,*.dll
let g:python_highlight_all = 1

set clipboard=unnamedが地味ながら結構重要で、Vimの無名レジスタとOSのクリップボードを連携させることが出来ます。
結構な割合でこの機能を有効にしないままVimを使っている人を見かけるのですが、不便すぎると思うのでちゃんと使った方がいいと思います。レジスタの機能は使いこなせば便利だとおもうんですが、僕は使いこなせていません。クリップボードで十分です。

Python固有の設定

vimrc内で'autocmd FileType python'している例が多いですが、多言語利用者はvimrcの管理が煩雑になるのでftpluginの利用をお勧めします。

" .vim/after/ftplugin/python.vim

if exists('b:did_ftplugin_python')
    finish
endif
let b:did_ftplugin_python = 1

setlocal smarttab
setlocal expandtab
setlocal tabstop=4
setlocal shiftwidth=4
setlocal foldmethod=indent
setlocal commentstring=#%s

" - af: a function
" - if: inner function
" - ac: a class
" - ic: inner class

" this plugin has aditional key-bind
"  -  '[pf', ']pf': move to next/previous function
"  -  '[pc', ']pc': move to next/previous class
xmap <buffer> af <Plug>(textobj-python-function-a)
omap <buffer> af <Plug>(textobj-python-function-a)
xmap <buffer> if <Plug>(textobj-python-function-i)
omap <buffer> if <Plug>(textobj-python-function-i)
xmap <buffer> ac <Plug>(textobj-python-class-a)
omap <buffer> ac <Plug>(textobj-python-class-a)
xmap <buffer> ic <Plug>(textobj-python-class-i)
omap <buffer> ic <Plug>(textobj-python-class-i)

setlocal omnifunc=jedi#completions

後述するプラグイン、jeditextobj-python用の設定も同時にしています。

Pythonのシンタックスハイライトにいくつか追加する

Pythonのデフォルトのシンタックスはかなり簡素です。
Pythonにおける事実上の予約語であるselfや、演算子などをハイライトするようにすることで可読性が向上します。Go言語でもerrをシンタックスに追加すると捗るぜみたいな記事が話題になってましたね。そういう感じです。

if version < 600
  syntax clear
elseif exists('b:current_after_syntax')
  finish
endif

" We need nocompatible mode in order to continue lines with backslashes.
" Original setting will be restored.
let s:cpo_save = &cpo
set cpo&vim

syn match pythonOperator "\(+\|=\|-\|\^\|\*\)"
syn match pythonDelimiter "\(,\|\.\|:\)"
syn keyword pythonSpecialWord self

hi link pythonSpecialWord    Special
hi link pythonDelimiter      Special

let b:current_after_syntax = 'python'

let &cpo = s:cpo_save
unlet s:cpo_save

僕はカラフルな方が好きなんですよ。

Vimプラグインの導入

汎用的なプラグイン

これについては無数に解説があるので以下略

  • Shougo/neobundle.vim

    プラグインを管理するプラグインです。
    解説やヘルプを読んで、filetype plugin indent onのタイミングなどについては気をつけて設定してください。

  • Shougo/neocomplete.vim

    neocomplcache.vimはすでに開発が停止しているので、どうしても+luaしたくないという人以外はこっちを使いましょう。

  • Shougo/Unite.vim

    必須の最高便利です。

  • Shougo/unite-outline

    クラスや関数名の一覧を表示するunite sourceです。

  • Shougo/neosnippet

    スニペットです。

  • thinca/vim-quickrun

    編集中のソースコードを非同期実行して、結果をみることが出来ます。必須だと思います。

  • kana/vim-smartinput

    IDE的な、対応するカッコの自動入力だとかそういうものを設定しやすくしてくれます。個人的にはかなり愛用しているプラグインです。

  • kana/vim-operator-user, kana/vim-textobj-user

    僕がVimを愛用している大きな理由の一つである昨日、オペレーターとテキストオブジェクトをユーザが拡張しやすくしてくれるプラグインです。
    オペレーターとテキストオブジェクトですが、これを使えないとVimを使う意味が5割くらい減るので、IDEを使わないのならば是非覚えましょう。

  • kana/vim-operator-replace

    vim-operator-userを利用しています。Vimに欠けている「クリップボードの文字列で対象の文字列を入れ替える」という機能を補ってくれます。

  • rhysd/vim-operator-surround

    編集系の中でも最高のプラグインの一つであるsurround.vimの改良版です

ここらへんのプラグインは、汎用的に色々と使えるので設定しておくと大変捗ります。

Python用のおすすめVimプラグイン

  • davidhalter/jedi-vim

    IDEの様なオムニ補完を提供してくれるプラグインです。 neocompleteと一緒に設定するといいでしょう。設定についてはいくらでも紹介記事があるので割愛します。

  • andviro/flake8-vim

    Pythonのソースコードに対して、静的検査やスタイルチェックをかけてくれるプラグインです。エラーがあった場所を赤くハイライトしてくれます。
    ケアレスミスがなくなります。

    もう一つ、同じようなプラグインがあるのですが依存するPythonモジュールのsubmodule化などがされておらず、設定が煩雑なため、僕はこちらを推奨します。

  • hynek/vim-python-pep8-indent

    Vim標準のPythonのインデントは挙動が不審で、普通に書いているとpep8に違反してしまうため、こちらを入れることで快適にコーディング出来るようになります。

  • jmcantrell/vim-virtualenv

    Vim内のPython環境とvirtualenvを連動させてくれるプラグインです。必須です。

  • hachibeeDI/python_hl_lvar.vim

    拙作です。
    編集している関数のうち、ローカル変数をハイライトします。結構便利だと思ってます。

  • kana/vim-textobj-indent

    インデント単位でテキストオブジェクトを使えるようになります。
    インデントの調整や、コメントアウトなどPythonでは大変便利なテキストオブジェクトです。

  • bps/vim-textobj-python

    Pythonの関数やクラスをテキストオブジェクトとして扱えるようになります。便利です。

  • hachibeeDI/smartinput-petterns

    前述した、smartinputの便利設定を僕が独断と偏見で作った奴です。Python以外の設定も入ってたりします。
    大変個人的なものなので使ってみて気に入った人だけどうぞ。

まとめ

この記事についてですが、元々は社内でチーム用に作ってた文章を手直ししたものになります。如何せん設定項目が多いので、気になった部分を少しずつ取り入れていくといいんじゃあないでしょうか。

広く浅く、という感じで紹介したので各項目の情報量は少なくなっているかもしれません。
jediなど、個別のプラギンとかの設定については少々古いですがこちらの記事がわかりやすいと思います。

Vimを最強のPython開発環境にする2 - Λlisue's blog

以上。気が向いたらまた情報量が増えていくかと思います。

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

Vim script テクニックバイブル ~Vim使いの魔法の杖

Vim script テクニックバイブル ~Vim使いの魔法の杖