VimでPythonのIDE環境を構築するために、この週末を費やしていました。納得の行くところまで実装できたので、忘備録として残しておきます。これから新しくPythonのためにVimを使おうと思っている人も、すでに使ってらっしゃる方にも参考になれば嬉しいです。
筆者環境
- Windows 7 x64
- Python 2.7.9 x32
Vimの導入・設定
Vimは普通に公式ページからインストールしても結構ですが、日本人の間ではKaoriya版のVimがよく使われているそうです。日本語の対応や、Shogoさんのneocompleteのプラグインを使うために必要なLuaを含めたビルドになっている等、Kaoriyaを使うメリットは多いです。
上記サイトから対象のVimのバイナリを入手して、対象のProgram Files下のディレクトリに保存してください。フォルダ中の"gvimrc"と"vimrc"というファイルは、とりあえず不要な設定が導入されているので削除しておきます。
他との兼ね合い上、Vimのencodingをutf-8で使いたいため、vim74-kaoriya-win32/switches/catalogフォルダに保存されているutf-8.vimをvim74-kaoriya-win32/switches/enabledフォルダに移動しておきます。
Kaoriyaを使うことに関しては、上記サイトを読んでおくと勉強になります。
Vundleの設定
rubyのBundleみたいな感じで簡単にGit上のVimプラグインを導入するためのプラグインです。
「NeoBundleを使うべき」みたいな記述をとても多く見つけるので、NeoBundleを使ったほうが良いかもしれませんが、まだVundleで事足りる程度しか使いこなせていないため、とりあえずVundleを導入しています。
インストールは~/.vim/bundleというディレクトリを作成し、上記サイトよりダウンロードしたファイルを~/.vim/bundle/vundleに保存します。
~/.vimrcというファイルを作成し、下記のように記述します。
set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! Bundle 'gmarik/vundle'
これでVundleを使う準備ができました。
プラグインのインストール
~/.vimrcに下記のようにプラグインを追加していきます。
Bundle 'altercation/vim-colors-solarized' Bundle 'davidhalter/jedi-vim' Bundle 'bronson/vim-trailing-whitespace' Bundle 'airblade/vim-gitgutter' Bundle 'kevinw/pyflakes-vim' Bundle 'Shougo/neocomplete.vim' Bundle 'scrooloose/nerdtree' Bundle 'bling/vim-airline' Bundle 'thinca/vim-quickrun' Bundle 'kien/ctrlp.vim' Bundle 'ivanov/vim-ipython'
追加ができたら保存して、Vim上で.vimrcを操作していたならば":so %"のコマンドを入力、それ以外の場合はVimを再起動します。
:BundleInstall
上記のコマンドをVim上で行うと、自動でプラグインがインストールされます。
各プラグインの説明と設定
Pythonの強力な入力補完 jedi-vim
Pythonの入力補完用プラグインで、かなり強力です。
ただいくつか不要な機能があるので、無効化するために設定します。
.vimrcに下記を追加します。
let g:jedi#auto_vim_configuration = 0 if !exists('g:neocomplete#force_omni_input_patterns') let g:neocomplete#force_omni_input_patterns = {} endif let g:neocomplete#force_omni_input_patterns.python = 'hw*|[^. t].w*'
~/.vim/bundle/jedi-vim/jedi_vim.pyを少し書き換えます。
+ info=PythonToVimStr(c.docstring()), # docstr - info=PythonToVimStr(""),
見栄えをよくしよう! vim-colors-solarized
solarizedのテーマを使うためのプラグインです。見た目がよく人気らしいので、導入してみました。
テーマを反映させるために、.vimrcに下記コードを追加します。
" -- solarized personal conf set background=dark try colorscheme solarized catch endtry
Vim上から編集中のPythonを実行! vim-quickrun
この機能がなければIDEと呼べないですね。私はquickrunで実現してみました。Pythonファイルの編集中にF11を押せば実行されます。標準の設定から、結果が表示される位置を変更しています。
nnoremap <F11> :QuickRun<CR> let g:quickrun_config = { "_" : { "outputter/buffer/split" : ":botright", "outputter/buffer/close_on_empty" : 1 }, } nnoremap <expr><silent> <C-c> quickrun#is_running() ? quickrun#sweep_sessions() : "<C-c>"
これがなきゃ始まらない! vim-ipython
これは後日記事にしようと思います。ちょっとした設定をしないとちゃんと動きません。
余計な空白を一気に削除 vim-trailing-whitespace
":FixWhitespace"というコマンドで余計な余白を削除することができます。
VimでGItの変更点が分かる vim-gitgutter
Vim上からGitの変更点を識別するためのプラグインです。
Pythonの構文解析 pyflakes-vim
Pythonの構文を解析し、エラーや警告を表示してくれるようになります。
入力補完 neocomplete
有名な補完プラグインらしいです。これから勉強します。
ファイルマネジメント nerdtree
ファイルツリーウィンドウを表示してくれます。私は.vimrcに下記のように書き加えて F2 ボタンで表示するようにしました。
map <F2> :NERDTreeToggle<CR>
ステータスバーをかっこ良く! vim-airline
ステータスバーの表示をかっこ良くするプラグインです。powerlineとどちらを使うかかなり迷ったのですが、機能が豊富そうなairlineにしました。
私のairline用の.vimrcの設定をご紹介しておきます。tablineを有効にしています。
set laststatus=2 let g:airline#extensions#tabline#enabled = 1 let g:airline_theme = 'powerlineish'
多機能セレクタ ctrlp.vim
カレントディレクトリから対象のファイルを探してくれるコマンドを入力できるようになります。
.vimrcの追加の設定
Windows歴20年以上なので、CTRL+VとCはどうしても欲しいところ。あと、Insertモード中のBackspaceでは改行も消して欲しい。そういった変更を加えています。
Insertモード中だけ、CTRL+Vでクリップボードに貼付けができ、Visualモード中だけCTRL+Cでクリップボードにコピーできます。
set encoding=utf-8 syntax on set shiftwidth=4 set autoindent set expandtab set tabstop=4 set softtabstop=4 set number set backspace=indent,eol,start imap <C-V> <C-R>+ vmap <C-C> "+y filetype plugin indent on
全画面表示で起動時する
" Run maximized in GUI if has("gui_running") au GUIEnter * simalt ~x endif
デバッガー機能について
Eclipseからの乗り換えなので、pydevのような機能をVimにも欲しくなるのですが、残念ながらWindowsではこの機能の実装は難しいようです。
どうしても必要な場合は、Eclipse上から行うべきです。
参考までに、挑戦したプラグインについてご紹介しておきます。
pyclewn
バージョン2.0より前では、Windowsでも動いていたらしいです。今ではインストール用のバイナリも削除され、無理やりインストールしてみましたがちゃんと動きませんでした。
vimpdb(GoogleCode)
普通に使えばちゃんと動きます。ただ、マルチプロセス等をしようすると簡単にVimが落ちます。
gotcha/vimpdb
デバッガーとしてVimが立ち上がるコードが入力できるようになります。Vimからデバッガーを起動する挙動ではないので、なんだかなーっといった感じ。
Eclim
VimからEclipseを操作できるようになるwrapperといった感じ。これが一番現実的です。Vim上からEclipseのプロジェクト管理ができるようになるので、これで開発を進めつつ、必要に慣ればEclipse上でデバッグするというのが一番効率が良い気がします。
まとめ
これで、だいたいの欲しい機能は実装できました。コードを書いてF11で実行してテスト、必要に慣れば、Eclipse上からデバッグするというのが良さそうです。良い快適なVim Lifeを!
あとがき
Vimmerとしてはまだまだnewbieなので、ぜひ先輩方からアドバイスをいただきたく、記事にしてみました。間違っているところや、もっと良い環境の構築方法がありましたら、ぜひご教示いただければ嬉しいです!
最終的な.vimrcファイル
set encoding=utf-8 syntax on set shiftwidth=4 set autoindent set expandtab set tabstop=4 set softtabstop=4 set number set backspace=indent,eol,start imap <C-V> <C-R>+ vmap <C-C> "+y filetype plugin indent on set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! Bundle 'gmarik/vundle' Bundle 'altercation/vim-colors-solarized' Bundle 'davidhalter/jedi-vim' Bundle 'bronson/vim-trailing-whitespace' Bundle 'airblade/vim-gitgutter' Bundle 'kevinw/pyflakes-vim' Bundle 'Shougo/neocomplete.vim' Bundle 'scrooloose/nerdtree' Bundle 'bling/vim-airline' Bundle 'thinca/vim-quickrun' Bundle 'kien/ctrlp.vim' Bundle 'ivanov/vim-ipython' " The bundles you install will be listed here " The rest of your config follows here augroup vimrc_autocmds autocmd! " highlight characters past column 120 autocmd FileType python highlight Excess ctermbg=DarkGrey guibg=Black autocmd FileType python match Excess /%120v.*/ autocmd FileType python set nowrap augroup END set laststatus=2 let g:airline#extensions#tabline#enabled = 1 let g:airline_theme = 'powerlineish' " -- solarized personal conf set background=dark try colorscheme solarized catch endtry if (exists('+colorcolumn')) set colorcolumn=100 highlight ColorColumn ctermbg=9 endif " To allow jedi and neocomp activated together autocmd FileType python setlocal omnifunc=jedi#completions let g:jedi#auto_vim_configuration = 0 if !exists('g:neocomplete#force_omni_input_patterns') let g:neocomplete#force_omni_input_patterns = {} endif let g:neocomplete#force_omni_input_patterns.python = 'hw*|[^. t].w*' map <F2> :NERDTreeToggle<CR> nnoremap <F11> :QuickRun<CR> let g:quickrun_config = { "_" : { "outputter/buffer/split" : ":botright", "outputter/buffer/close_on_empty" : 1 }, } nnoremap <expr><silent> <C-c> quickrun#is_running() ? quickrun#sweep_sessions() : "<C-c>"
コメント
If you are using vim 8 / neovim, maybe you can try asyncrun: https://github.com/skywind3000/asyncrun.vim as a replacement to quickrun with better user experience and expansibility.