ぱちコマな日々

ざれごと、たわごと、うわごと、しごと。

dein.vimをNeovimにインストールする @Windows10

確認環境

Spec / Version
PC mouse LB-J770X-SH2
OS Windows10 Home (ver 1607 build 14393.693)
neovim v0.2.0-621-ge901868f
neovim-qt v0.2.4

今回やること

以前vimを使っていたときは、動作が重くなるのを嫌ってあまりプラグインを使っていませんでした。
しかし、今のPCになってサクサク動く予感がするので活用していこうかと思います。
まず今回はプラグインを管理する為のプラグインdein.vimをインストールします。

  1. Python3をインストール
  2. Python3のneovimパッケージをインストール
  3. dein.vimの設定とインストール

Python3をインストール

使いたいプラグインで何かとPython3が必要になりそうなので、この際インストールしちゃいます。
公式サイトからインストーラをダウンロードして入れて下さい。
何だかバージョンがたくさんありますが、私は一番新しい3.6.0をインストールしました。
ただし3.6.0の場合、次のneovimパッケージのインストールでひと悶着あるかもです。
少しでも手順を省きたい方は3.5.xで良いかと思います。
インストール手順は下記サイトが分かりやすいと思います。

Pythonをインストールする(for Windows) - Qiita

Python3のneovimパッケージをインストール

NeovimからPython3を使えるように、Pythonのneovimパッケージをインストールします。
コマンドプロンプトから下記コマンドを打ち込んでインストールして下さい。

> pip3 install neovim 

何かエラー出た

私の場合、Python3.6.0をインストールしたら以下のようなエラーが出ました。
(Python3.5.3で試したところエラーは出ませんでした)

> pip3 install neovim
Collecting neovim
  Using cached neovim-0.1.13.tar.gz
Requirement already satisfied: msgpack-python>=0.4.0 in c:\users\username\appdata\local\programs\python\python36\lib\site-packages (from neovim)
Collecting pyuv>=1.0.0 (from neovim)
  Using cached pyuv-1.3.0.tar.gz
Collecting greenlet (from neovim)
  Using cached greenlet-0.4.12-cp36-cp36m-win_amd64.whl
Installing collected packages: pyuv, greenlet, neovim
  Running setup.py install for pyuv ... error
Exception:
Traceback (most recent call last):
  File "c:\users\username\appdata\local\programs\python\python36\lib\site-packages\pip\compat\__init__.py", line 73, in console_to_str
    return s.decode(sys.__stdout__.encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8c in position 91: invalid start byte

~~~ 以下省略 ~~~

なんでやねん! 出ました。デコードエラーです。
日本は好きですが、こういうときだけ英語圏に生まれたかったと思います。

今は対策を調べる気力もないので、問題が出ているPythonスクリプトを直接弄りました。
よい子のみんなはマネしないでね!といいつつ、修正箇所を載せておきます。

#修正ファイル: %LOCALAPPDATA%\Programs\Python\Python36\Lib\site-packages\pip\compat\__init__.py
#修正箇所: 75行目付近

if sys.version_info >= (3,):
    def console_to_str(s):
        try:
            return s.decode(sys.__stdout__.encoding)
        except UnicodeDecodeError:
            #return s.decode('utf_8')  # 修正前
            return s.decode('cp932')   # 修正後

sys.__stdout__.encodingの値を調べてみるとutf_8になっていました。
それでエラーが出ているのにまたutf_8を指定してデコードしようとしてエラー発生。
めでたくスクリプトが中止していたようです。

ひとまず上記の修正後、最初のpipコマンドを再実行したら無事にインストール出来ました。

dein.vimの設定とインストール

init.vimに以下の設定を追加して下さい。

"--------------------------------------------------
" プラグイン関連
"--------------------------------------------------
" Pythonのパス
let g:python3_host_prog = fnameescape(expand('$LOCALAPPDATA\Programs\Python\Python36\python.exe'))

" Neovim設定ディレクトリ
let nvim_dir = substitute(expand($XDG_CONFIG_HOME) . '/nvim/', '\', '/', 'g')

" deinの関連のパス
let dein_path = 'github.com/Shougo/dein.vim'
let dein_url = 'https://' . dein_path

" プラグインをインストールするディレクトリ
let s:dein_dir = nvim_dir . '.cache/dein/'
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . 'repos/' . dein_path

" dein.vimがなければインストールする
if !isdirectory(s:dein_repo_dir)
  execute '!git clone ' . dein_url s:dein_repo_dir
endif
" dein.vimをruntimepathへ追加
let &runtimepath = s:dein_repo_dir . "," . &runtimepath

" 設定開始
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " プラグインリストファイル
  let s:toml = nvim_dir . '/plugins.toml'
  let s:lazy_toml = nvim_dir . '/plugins_lazy.toml'
  " プラグインリストを読み込みキャッシュする
  call dein#load_toml(s:toml, {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})
  " 設定終了
  call dein#end()
  call dein#save_state()
endif

" 未インストールのプラグインがある場合はインストール
if dein#check_install()
  call dein#install()
endif

やっていることはざっくり以下です。

  1. Python3のパス設定
  2. dein.vim未インストール時の設定
  3. dein.vimをruntimepathへ追加
  4. プラグインリスト(後述)のプラグインをロード
  5. 未インストールプラグインのインストール

Python3のパスは、実際に皆さんがインストールしたパスに変えて下さい。
また、インストールディレクトリなどもお好みで。

参考)

プラグインリストの作成

次に、実際に読み込むプラグインのリストファイルを作ります。
といっても、まだ私自身よく理解できていないのでこちらのサイトのGo環境用の設定をそのまま追加しました。
Go開発環境の構築はきっとまた後日。

プラグインリストは、以下2つを用意しています。

  • plugins.toml ・・・Neovim起動時にロードするプラグインリスト
  • plugins_lazy.toml ・・・必要になったときに初めてロードするプラグインリスト
#FILE: %XDG_CONFIG_HOME%/nvim/plugins.toml

[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]]
repo = 'neomake/neomake'
hook_add = '''
  autocmd! BufWritePost * Neomake
'''
# File: %XDG_CONFIG_HOME%/nvim/plugins_lazy.toml

[[plugins]]
repo = 'fatih/vim-go'
on_ft = 'go'
hook_source = '''
let g:go_fmt_command = 'goimports'
  let s:goargs = go#package#ImportPath(expand('%:p:h'))
  let g:neomake_go_errcheck_maker = {
    \ 'args': ['-abspath', s:goargs],
    \ 'append_file': 0,
    \ 'errorformat': %f:%l:%c:\ %m, %f:%l:%c\ %#%m',
    \ }
  let g:neomake_go_enabled_makers = ['golint', 'govet', 'errcheck']
'''

Neovimの再起動

プラグインリスト作成後、Neovimを再起動して下さい。
初回起動時はdein.vim含めたプラグインのインストール処理が走るので、ちょっと固まったようになるかと思います。
Neovimのいつもの画面が表示されたら:messagesコマンドを実行し、以下のようなメッセージが表示されたらきっとちゃんと動いています。

f:id:pachicoma:20170220004438p:plain

ひとまずこれで無事、dein.vimによるプラグイン管理ができるようになりましたとさ。
 
おしまい。

<おまけ> has(‘python3’)が0になる問題

今回のプラグインには関係ないですが、Python3のパッケージ設定がうまくいかずにハマったので忘備録として。
Python3とneovimパッケージがインストール出来ていれば、Neovimから:echo has('python3')コマンドを実行したときに1が返ってくるそうです。
ということでカタカタパーンと実行します。あれ、0が返ってきたぞ。。。
この問題はこちらのサイトを参考にしながら試行錯誤したものの解決出来ずに困っていたのですが、Neovimを本記事執筆時点の最新版(v0.2.0)にしたら何もせずとも1が返ってくるようになっていました。
開発者サマサマですね。ありがたや~。

もしNeovimを最新版にしても1が返ってこないときは、Neovimから下記コマンドを実行してインストールしたPythonのバージョンが返ってくるか確認してみて下さい。

:echo system([g:python3_host_prog, '--version'])

エラーが出る場合はg:python3_host_progのパス設定がうまくいってないので見直して下さいな。