注意: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
後述するプラグイン、jedi
とtextobj-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
以上。気が向いたらまた情報量が増えていくかと思います。
- 作者: DrewNeil,新丈径
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2014/01/28
- メディア: Kindle版
- この商品を含むブログ (3件) を見る
Vim script テクニックバイブル ~Vim使いの魔法の杖
- 作者: Vim scriptサポーターズ
- 出版社/メーカー: 技術評論社
- 発売日: 2014/08/06
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る