Mac で Vim を Python の開発環境にする。

大きく書き換えました。

主な変更点は次の 8 点です。
1. Vim → Neovim
2. 新規採用 → pycodestyle
3. 新規採用 → pydocstyle
4. NeoBundle → dein.vim
6. 新規採用 → deoplete.nvim
7. jedi-vim → deoplete-jedi
8. virtualenv → 削除(分離が可能になったので venv に更新し 別立て


Neovim は Vim の後継機みたいなものです。












旧版


作業が完了すると vim は、次の3つの動作をするようになります。


f:id:domodomodomo:20160209010916p:plain
① 構文の色付け


f:id:domodomodomo:20160209004543p:plain
② 構文チェック Syntastic pyflakes
invalid syntax の指摘


f:id:domodomodomo:20160209004606p:plain
③ 自動補完 jedi-vim


作業

大まかに分けて、これから次の6つのものを追加、インストールします。

項番 名前 説明
Step1 vim vimPython インターフェイスを有効にするため
Step2 ~/.vimrc vim の設定ファイルに syntax on を追記
Step3 Neobundle vim プラグインのパッケージマネージャ
Step4 vim-virtualenv virtualenvの環境にパスを通すためのvimプラグイン
Step5 pyflakes Python の構文チェックツール
Step6 Syntastic 構文チェックさせるための vim プラグイン
Step7 jedi-vim 自動補完させるための vim プラグイン


 

環境

本稿では vim について書いています。Python そのものの環境については、こちらに記載した環境を前提に進めさせていただきます。なお本稿では、pyenv を使わず Python2 あるいは Python3 どちらか一方のバージョンだけの Python を使っているものとして説明をさせていただきます。



Step1. vim の再インストール

vimPython インターフェイスを有効にするために行います。Syntastic や jedi-vim は Python2 あるいは Python3 のコードを読み取って解析をしてくれるわけですが、肝心の vim にはいっている Python のバージョンと MacPython のバージョンが一致していないことがあります。

というか僕は一致していませんでした。そうすると Syntastic, jedi-vimPython を読み込めなくなるので vimPython インターフェイスのバージョンと MacPython のバージョンを揃えようという話であります。


Step1-1. vim に 当該 バージョンの Pythonインターフェイスが有効になっているかを確認

それでは、まず、Pythonインターフェイスが有効になっているかを確認してみましょう。

$ vim --version | grep python
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace

 
例えば上記の実行結果にある -python3 は、vim に Python3 が含まれていないことを表します。もし Python3 を使用している場合、 Python3 を含めて再コンパイルする必要があります。vim が何かと一緒にコンパイル?インストール?されているなんて初めて知ったし、この辺を知らないでかなり苦労しました。

もし、「vimPython がはいっている」という話に、いまいちピンとこない方は vimノーマルモードで以下のように打ち込んでみてください。 Python が実行されます。vim の中に Python を実行できるような環境があるのが確認できます。

:python print(sys.version) # Python2
:python3 import sys; print(sys.version) # Python3 

Vimの言語インターフェースのバージョン確認 - Qiita
 

ここから先は Python3 を有効にし Python2 を無効にする作業を行います。もし、Python2 を使っている場合は、適宜 Python2 に読み替えてください。

Step1-2. +python3 となるように vim を再インストール

Step1-1 で -python3 と表示されていた場合、+python3 となるように vim を再インストールします。

ネットで調べてみるとこういうのを「vimPython インターフェイスを有効にする」みたいな表現のされ方をしています。他にも「vimRuby インターフェイスを有効にする」など。

ここではパッケージマネージャーとして Homebrew を使用して、再インストールの作業を進めます。

$
$ # Step1-2-1.
$ # いま何を有効にしているかを確認
$ vim --version
$
$ # Step1-2-2.
$ # vim のパスを確認
$ which vim
/usr/bin/vim
$
$ # Step1-2-3.
$ # Homebrew でインストールする vim の情報を確認
$ # 指定できる option の一覧を見ることができます。
$ brew info vim
vim: stable 7.4.944, HEAD
...
==> Options
...
--with-python3
	Build vim with python3 instead of python[2] support
...
$
$ # Step1-2-4.
$ # vim をインストール
$ brew install vim --with-python3
... 中略 ...
$
$ # Step1-2-5.
$ # path が変わっていることを確認
$ which vim
/usr/local/bin/vim
$
$ # path が /usr/bin/vim から /usr/local/bin/vim に
$ # 変わっていますね。
$ #
$ #
$ # アンインストールもしていないのに
$ # 元の /usr/bin/vim はどこに行ってしまったのでしょうか? 
$ #
$ # Homebrew は 
$ # /usr/local/bin/ 配下にパッケージをインストールします。
$ # /usr/local/bin/ にはユーザが保存したコマンドが保存されます。
$ # 
$ # 一方...
$ # /usr/bin/ にはデフォルトではいっているコマンドが格納されます。
$ # なので OS をアップデートすると一緒にアップデートされたりします。
$ #
$ # なので、デフォルトの vim コマンド /usr/bin/vim は削除されていません。
$ # フルパスで指定すると実行できたりします。
$ /usr/bin/vim
$ # http://dqn.sakusakutto.jp/2011/08/linux_usrlocal.html
$ # http://nihaoshijie.hatenadiary.jp/entry/2014/07/13/103905
$
$ # Step1-2-6.
$ # +python3 の表記を確認。 -python3 はダメ。
$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Dec  1 2015 12:11:28)
...
+conceal         +libcall         -python          +vreplace
+cryptv          +linebreak       +python3         +wildignore
...

 

ちなみに...

$ brew install vim --with-python3 --with-python としても
$ # +python +python3 と両方 + にすることはできない。
$
$ # brew info vim の実行結果にあるオプションの一覧には
$ # --with-python と言う option は無いしね。
$
$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Dec  1 2015 12:11:28)
...
+conceal         +libcall         -python          +vreplace
+cryptv          +linebreak       +python3         +wildignore

vimをアップデートすると同時にHomebrew管理に移行する - Qiita
初心者がVimをインストールするメモ - Qiita

Step1-3. backspace を有効にする。

その後、見事に backspace が効かなくなったため ~/.vimrc に次の1行を追記しました。

set backspace=indent,eol,start

vimで文字が削除出来ないと思ったらバックスペースが効かなくなった - Qiita

Step1-4. Mac の Python3 と vim の Python3 のバージョンの確認

Mac の python3 と同じバージョンの python3 が vim にはいったことを確認しましょう。--with-python3 とすると、いま Homebrew ではいっている Python と同じバージョンの Python がはいります。

$ python3 -c 'import sys; print(sys.version)'
3.5.1 (default, Jan 16 2016, 10:24:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)]
$
$ vim
:python3 import sys; print(sys.version)
3.5.1 (default, Jan 16 2016, 10:24:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)]

Step2. vim の設定ファイル ~/.vimrc の編集 構文の色付け

vim ~/.vimrc を実行して、syntax on を追記しましょう。これで色付けをしてくれるようになります。

f:id:domodomodomo:20160209011346p:plain


Step3. Neobundle のインストール

Neobundle しか使ったことがないのですが、これまた優れた vim プラグインのパッケージマネージャらしく、本稿でもこれを用います。

GitHub には様々な vim プラグインが公開されています。Neobundle を使うと、その URL を ~/.vimrc に書くだけで、その vim プラグインがインストールできるようになります。

この後の Syntastic と jedi-vim は、この Neobundle を使ってインストールします。Neobundle そのもののインストールは、下記の手順をご参照ください。

公式インストール手順
ワイのインストール手順、ほぼ公式コピペ


Step4. vim-virtualenv インストール

vim は virtualenv のパスを参照していません。例えば、 virtualenv の環境下で Django を pip でインストールしていたとしても、jedi-vim は virtualenv へのパスがわからないので Django について補完処理を行ってくれません。そこで vim-virtualenv をインストールしていきます。

この Step4 の vim-virtualenv は、virtualenv と virtualenvwrapper の環境で pip でインストールした Python モジュールを jedi-vim が参照できるようにするための vim プラグインです。もし virtualenv と virtualenvwrapper をいれない場合、この Step4 の vim-virtualenv のインストールは不要になります。
vim-virtualenv 公式サイト


Step4-1. vim に virtualenv へのパスが含まれているか確認

以下は vimノーマルモードです。virtualenv のパスが入っていません。

$ workon py3env
(py3env)$ vim
:python3 import sys
:python3 for path in sys.path: print(path)
/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python34.zip
/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4
/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin
/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload
/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages
_vim_path_

 

逆に仮想環境下 py3env 配下では、 virtualenv へのパスが含まれています。

$ py3env
(py3env)$ python
>>> import sys
>>> for path in sys.path: print(path)
/Users/user_name/.virtualenv/py3env/lib/python3.5/site-packages
/Users/user_name/.virtualenv/lib/python35.zip
/Users/user_name/.virtualenv/py3env/lib/python3.5
/Users/user_name/.virtualenv/py3env/lib/python3.5/plat-darwin
/Users/user_name/.virtualenv/py3env/lib/python3.5/lib-dynload
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin

Step4-2. ~/.vimrc を編集

次の一文を~/.vimrc に追記します。

" https://github.com/davidhalter/jedi-vim からダウンロード&インストール
NeoBundle 'davidhalter/jedi-vim'

 
どのあたりに追記するかは、以下のとおり。公式サイトにあった Sample .vimrc に追記するような形で記しています。

 " Note: Skip initialization for vim-tiny or vim-small.
 if 0 | endif

 if has('vim_starting')
   if &compatible
     set nocompatible               " Be iMproved
   endif

   " Required:
   set runtimepath+=~/.vim/bundle/neobundle.vim/
 endif

 " Required:
 call neobundle#begin(expand('~/.vim/bundle/'))

 " Let NeoBundle manage NeoBundle
 " Required:
 NeoBundleFetch 'Shougo/neobundle.vim'

 " My Bundles here:
 " Refer to |:NeoBundle-examples|.
 " Note: You don't set neobundle setting in .gvimrc!


 "
 " ここに記載しています。
 " 

 " https://github.com/jmcantrell/vim-virtualenv からダウンロード&インストール
 NeoBundle 'jmcantrell/vim-virtualenv' 



 call neobundle#end()

 " Required:
 filetype plugin indent on

 " If there are uninstalled bundles found on startup,
 " this will conveniently prompt you to install them.
 NeoBundleCheck

Step4-3. vim-virtualenv をインストール

追記が終わったら以下のコマンドを vimノーマルモードで入力する。

:NeoBundleInstall

Step4-4. パスが追加されることを確認

:VirtualEnvActivate YOUR_VIRTUALENV_PROFILE_NAME として virtualenv へのパスを切り替えます。

$ workon py3env
(py3env)$ vim
:VirtualEnvActivate py3env
:python3 import sys
:python3 for path in sys.path: print(path)
/Users/user_name/.virtualenv/py3env/lib/python3.5/site-packages
↑
1つ追加されました!
1つしか追加されていませんが、これで pip install したモジュールを jedi-vim が参照できるようになります。
pip install したモジュールは site-packages 配下に置かれます。
/Users/user_name/.vim/bundle/vim-virtualenv
/Users/user_name/.vim/bundle/vim-virtualenv/autoload
/Users/user_name/.vim/bundle/vim-django-support/lib
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python35.zip
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages
_vim_path_

 

1度 deactivate してパスがどう切り替わるかを確認して、動作を見てみると理解しやすいかもしれません。

:VirtualEnvDeactivate
:python3 for path in sys.path: print(path)

ひとこと: Step1-4 で何故 vimPython インターフェイスのバージョンと OS の Python のバージョンが一致しているかを確認したか。

なんでこんなこと確認しているの?かと言いますと、vim-virtualenv が vimPython インターフェイスのバージョンに合わせたパスを設定してしまうからです。以下は Python3 の virtualenv の環境下で Python2(version 2.7) のインターフェイスを有する vim を起動、コマンドを入力した例になります。

$ workon py3env
(py3env)$ # Python2 のインターフェイスが有効になっている
(py3env)$ # Mac に最初から付いている vim を起動しましょう。
(py3env)$ # 
(py3env)$ /usr/bin/vim
:NeoBundleInstall
:VirtualEnvActivate py3env
:python for path in sys.path: print(path)
/Users/user_name/.virtualenv/py3env/lib/python2.7/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip
/Library/Python/2.7/site-packages
↑ 
存在しない python2.7 配下の site-packages を参照してしまっている。
この 2.7 という数字は vim の Python インターフェイスのバージョンから来ています。
:python print(sys.version)
2.7.10 ...

 

何だよ、このパス揃えるためだけに、わざわざ vim を再インストールして "vimPython インターフェイスのバージョン"と "MacPython のバージョン" を揃えたのかよって感じられるかもしれません。

ただ、"MacPython のバージョン" と "vimPython インターフェイスのバージョン" を揃えない場合は、色々と作業が必要になってきます。

このページに来たワイのような初心者には厳しい作業だと感じたので、この方法になっています。

やり方は色々あるようです。やや面倒な様です。

Step5. pyflakes

pyflakes は Python の構文チェックツールです。構文的に間違ったコードを指摘してくれます。
Pythonのスタイルガイドとそれを守るための各種Lint・解析ツール5種まとめ!

Step5-1. インストール

$ pip install pyflakes

Step5-2. 動作確認

適当に構文を間違えた Python ファイルを作って動作を確認してみましょう。

$ pyflakes sample.py
sample.py:1: undefined name 'newgame'

Step6. Syntastic

jedi-vim の次は、ぜひ Syntastic をいれてみましょう。Syntastic は vim の構文チェックツールです。Syntastic に pyflakes を使って構文解析をするように設定を進めていきます。



参考にした神様のサイト

ただ、上記のサイトでは pylint を指定していますが pyflakes を指定したほうが、このページに来たワイみたいな初心者の場合は良さそうです。何故なら pylint は死ぬほど指摘してくれるので、それを確認したり、直したりするだけで1ヶ月かかりそうだったので。チーム開発でコーディング規約を綿密に作るなら pyflakes の方が良いと感じますが。また pylint をいれると jedi-vim がエラーを吐くようになります。
pylint をインストールをすると jedi-vim がエラー - いっきに Python に詳しくなるサイト


Step6-1. ~/.vimrc に次の2行を追記

追記する場所は、vim-virtualenv の真下くらい。

" syntastic のインストール
NeoBundle 'scrooloose/syntastic'

" syntastic に pyflakes を指定
" g => Global, l => Local
" 代入 スコープ  : 変数名                     = 値
" let g        : syntastic_python_checkers = ['pyflakes']
let g:syntastic_python_checkers = ['pyflakes']

変数のスコープ — 名無しのvim使い


Step6-2. Syntastic のインストール

追記が終わったら以下のコマンドを vimノーマルモードで入力する。

:NeoBundleInstall

Step6-3. 動作確認

間違った構文を入力して、syntax error を指摘してくれるかを確認してみましょう。保存 :w したタイミングでチェックをかけてくれます。

f:id:domodomodomo:20160211123811p:plain

 

ひとこと: Django の template ファイルの構文解析

Django を使っている場合の話になりますが Syntastic をいれたあとに Django の template ファイルを修正よしようとすると、正しいにもかかわらず色々警告してくれます。これは Django の template ファイルの形式が、通常の html ファイルとは書式が若干異なるからです。そのため ~/.vimrc に次の文言を追加すると、そう言った警告を出さなくなります。
VIM - how to open .html files with django html syntax rather than just html syntax? - Super User

" html 拡張子がついてたら Django の templateとして
" 読み込んでね、という設定
autocmd FileType html setl filetype=htmldjango

 

あるいは都度 vimノーマルモード:setfiletype htmldjango とすることでも、それを解消できます。

django.vim - Syntax highlighting for Django templates : vim online
vimでDjangoのテンプレートを開いたときに色を付ける方法 | Code & Business
Google グループ



Step7. jedi-vim インストール

jedi-vim のインストールについては 公式インストール手順 ならびに 公式マニュアルとは異なり NeoBundle を使ってインストールしています。

Step7-1. ~/.vimrc に次の1行を追記

追記する場所は、vim-virtualenv の真下くらい。

" https://github.com/davidhalter/jedi-vim からダウンロード&インストール
NeoBundle 'davidhalter/jedi-vim'

Step7-2. jedi-vim のインストール

追記が終わったら以下のコマンドを vi のノーマルモードで入力する。

:NeoBundleInstall

Step7-3. 動作確認

virtualenv の環境下でインストールした Python の moduleを import して自動補完されるか、確認してみましょう。

f:id:domodomodomo:20160209002549p:plain

ひとこと: INSERT (paste)モード

INSERT (paste) モードになっていると、自動補完が効きません。INSERT モードに戻すには :set nopaste :set paste を指定するとINSERT (paste)モード になります。
... ペーストモードを自動で解除する方法 | 踊る犬.net





終わりに

MacvimPython の開発環境にするためのごく最低限の作業について記述してみました。至らぬところもあると思いますが、他の方が書いた vim に関するサイトを見てもある程度、理解出来るように書いてみました。以降、その他の様々な ~/.vimrc の設定等について、設定を追加していけるようであれば、嬉しく存じます。







広告

先日 iMac (21.5-inch, Mid 2011) の HDD が故障したので SSD の換装してもらいました。個人的に好印象だったので、お礼広告です。

もともと HDD とは別のところからカタカタ変な音がしてて、直せんものやろと思ってたのですが、「DVDドライブ冷却用ファンの回転軸に汚れが付着してバランス崩してるみたいです」みたいな話をいただいて。追加料金は発生しましたが直してもらいました。

福岡ってのがちょっと難点ですが、個人的に好印象だったのはこの件だけではないのですが、とりあえずオススメですね。



ちなみに iMac の 21.5-inch ならクロネコヤマトのパソコン宅急便 BOX F にて搬送が可能です。それより多きいサイズ 27-inch は対応していません。
ヤマト運輸 パソコン宅急便

ちなみにHDD から SSD に換装してもらってからは死ぬほど快適です。換装前は遅くて死んでました笑


ちなみにさらにメモリを増設しています。メモリ増設 + SSD換装で 5年前の PC ですが、全然問題なく使用できています。
iMac にメモリを取り付ける - Apple サポート