WindowsにNeoVimをセットアップ in 2018


この記事は[Vim Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vim) 3日目の記事です。

Windows10での[neovim-qt](https://github.com/equalsraf/neovim-qt)とPython環境、プラグイン管理の[dein](https://github.com/Shougo/dein.vim)のインストールと、はまったところの対応方法など。

## インストール

### 本体のインストール

https://github.com/neovim/neovim/wiki/Installing-Neovim#windows

パッケージマネージャの[chocolatey](https://chocolatey.org/)や[scoop](https://scoop.sh/)が使えますが、まずchocolateyを入れるのが若干手間ですね。
あと、インストールされる場所もユーザーフォルダ内だったりと、若干微妙です。

ということで、自分はビルド済みバイナリを取ってきてProgram Files/Neovimに配置してます。

![programfiles.png](https://qiita-image-store.s3.amazonaws.com/0/308784/f61f2388-6b1e-f4b0-7e1c-09235706ec82.png)

### Pythonのインストール

必須のプラグインが多いので、併せてインストールします。
[Python公式](https://www.python.org/) から .msi インストーラーを取ってきてウィザードをポチポチでいけます。

Pythonの実行環境はなくてもNeoVim自体は動きます。
ただし、Pythonインストール済みの環境ですと後述のNeoVim用APIを入れないとNeoVimが起動しない場合があります。

NeoVimではリモートプラグインという仕組みによって、デフォルトでPython、Node.js、Go、Luaの各言語のプラグインに対応します。

参考:  [Neovim のリモートプラグインを利用して好きな言語でプラグインを書く blog.syfm](https://syfm.hatenablog.com/entry/2016/12/17/151247)

### PipからNeoVim用APIをインストール

![pip_install_neovim.png](https://qiita-image-store.s3.amazonaws.com/0/308784/bb933b13-d5a8-f525-bb2d-31762642f497.png)

```powershell
> pip install pynvim
```

Pythonのパッケージ管理でNeoVim用APIをインストールします。
スクリーンショットでは古いパッケージ名のneovimを指定しています。
ログではneovim.tar.gzファイルとpynvim.tar.gzファイルの2つをダウンロードしてきてるのが確認できます。

[VC++ 14](https://visualstudio.microsoft.com/ja/downloads/)が必要です。入ってなければエラーで止まります。
Build Tools for Visual Studioをダウンロードして、C++ビルドツール、V14xビルドツールのC++/CLIサポート、V14xビルドツール用モジュール、Windows10 SDKあたりを入れてください。

[Pipパッケージ管理](https://www.python.jp/install/windows/pip.html)が入ってない場合は、.msiインストーラから修正インストールで行けると思います。

### 環境変数（パス）の設定

![path_env.png](https://qiita-image-store.s3.amazonaws.com/0/308784/a21ed4b8-33c0-84fb-0ea2-1ac96e96373a.png)

Pythonのインストール時に指定できますが、確認します。
通ってなかったら追記します。

> AppData\Local\Programs\Python\Python37-32
>
> AppData\Local\Programs\Python\Python37-32\Scripts

また、neovim.exeへパスを通しておくと、コマンドプロンプト/PowerShellでNeoVimが使えます。

[![Power ShellからNeoVim](http://img.youtube.com/vi/pC4djCIMiX8/0.jpg)](http://www.youtube.com/watch?v=pC4djCIMiX8)

### Pythonの実行パスをinit.vimで指定

NeoVimからPythonが実行できるように、init.vimで設定します。

NeoVimで `:checkhealth`を実行。結果が新規タブで下記のように表示されます。

```
health#provider#check
========================================================================
## Clipboard (optional)
  - OK: Clipboard tool found: win32yank

## Python 2 provider (optional)

～～～中略～～～

## Python 3 provider (optional)
  - INFO: `g:python3_host_prog` is not set.  Searching for python in the environment.
  - INFO: Multiple python executables found.  Set `g:python3_host_prog` to avoid surprises.
  - INFO: Executable: C:\Users\akiya\AppData\Local\Programs\Python\Python37-32\python
  - INFO: Other python executable: /python
  - INFO: Python3 version: 3.7.0
  - INFO: python-neovim version: 0.3.1
  - OK: Latest python-neovim is installed: 0.3.1


```



> -INFO: `g:python3_host_prog` is not set.  Searching for python in the environment.
> - INFO: Executable: C:\Users\akiya\AppData\Local\Programs\Python\Python37-32\python

実行可能なPythonが検出されていますので、AppData\nvim\init.vimでこのパスを指定します。

```
let g:python3_host_prog = 'C:\Users\akiya\AppData\Local\Programs\Python\Python37-32\python'
```

`:echo has('python3')` を実行、1が返ってくれば正しくPythonが使えます。

![healthcheck.png](https://qiita-image-store.s3.amazonaws.com/0/308784/303f1c46-3209-bb37-e1db-617937765f35.png)

### deinのインストール

”Dark powered Vim/Neovim plugin manager”こと[dein](https://github.com/Shougo/dein.vim)を入れます。

公式リポジトリにインストール用シェルスクリプトがありますので、Git Bashから実行するという手もありますが…

ユーザーフォルダに.cache以下のフォルダを作ってinit.vimに設定を書きます。
自分はdeinでdein自身を管理するために、deinが生成するフォルダ構造に合わせています。

![dein_folder.png](https://qiita-image-store.s3.amazonaws.com/0/308784/c2ac0d3a-d747-9cba-c138-bf10ded1e730.png)

```
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('C:\Users\akiya\.cache\dein')
  call dein#begin('C:\Users\akiya\.cache\dein')

  " Let dein manage dein
  " Required:
  call dein#add('C:\Users\akiya\.cache\dein\repos\github.com\Shougo\dein.vim')

  call dein#load_toml( 'C:\Users\akiya\AppData\Local\nvim\dein.toml')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

"End dein Scripts-------------------------

```

rutimepathに、dein.vimフォルダまでのパスを設定。

`call dein#begin` の引数のパスは`repos` フォルダの入っているフォルダのパス。

dein自身をdeinで管理する場合は、 
`call dein#add('C:\Users\akiya\.cache\dein\repos\github.com\Shougo\dein.vim')`
でパスを指定します。

`dein#add()` でプラグインを指定。

`call dein#load_toml`で、.tomlファイルに書いたプラグインの設定を読み込ませることができます。

NeoVimで`:call dein#install()`すれば、`dein#add()`で指定したプラグインが入ります。

ちなみにクイックスタート用のシェルスクリプトを実行すると、上記のようなinit.vim貼付用のコードが返ってきます。

## プラグイン

大体はVimのプラグインがそのまま動きますので、NeoVimで入れ直したプラグインというと…

- [dein](https://github.com/Shougo/dein.vim): パッケージ管理
- [deoplete](https://github.com/Shougo/deoplete.nvim): 補完
- [defx](https://github.com/Shougo/defx.nvim): ファイラー
- [ALE](https://github.com/w0rp/ale): リント

[Shougoさん](https://github.com/Shougo)のが多いです、足を向けて寝られません。
というか、私はDeopleteを使いたかったのでNeoVimに乗り換えたようなものです。

リントツールはVimで定番の[syntastic](https://github.com/vim-syntastic/syntastic)がNeoVimに対応していません。
そこで[ALE](https://github.com/w0rp/ale)を入れています。動作が高速で助かります。

[vim-gitgutter](https://github.com/airblade/vim-gitgutter)がNeoVimでは動かなかったのですが、今GitHub見たら対応してるみたいです。

## 他、不具合の対処方法やカスタマイズ

### init.vimでエラーがあると起動しない

![grayout.png](https://qiita-image-store.s3.amazonaws.com/0/308784/827cd0d6-e9b5-c017-53ce-e37b713c4d52.png)

> Neovim is taking too long to respond
 
ちょっとしたタイポでもこのような画面になってしまい、どうにもならなくなります。
init.vimを移動したりファイル名を変更したりして、素のNeoVimが起動するか試しましょう。
`:source init.vim` でエラーがなくてもダメな場合があります。

---2019年11月 追記---
v0.4.3でPythonインストール済みの場合は、pynvimパッケージを入れないとこのエラー画面が出て起動しませんでした。

---2019年6月 追記---
2019年5月末リリースの[NeoVim 0.3.7](https://github.com/neovim/neovim/releases/)では、起動後にinit.vimのエラーがコマンドラインに流れるようになりました。

また、swapファイルが残っていてもグレーアウトしてしまうことがあるので、`AppData\Local\nvim-data\swap`を確認してみてください。

### プラグイン管理で動かないのがある

WindowsのUAC（ユーザーアカウント制御）の関係で動かないのがありました。
deinは大丈夫です、[plug](https://github.com/junegunn/vim-plug)は去年はダメでした（最新版ではいけそうです）
deinも書き込み権限の要るフォルダは無理なようです。
`.cache/dein`が無難だと思います。

### フォント変更はginit.vim

ユーザーフォルダのAppData\Local\nvim内に ginit.vimを配置してGUI向けの設定を書きます。

```
Guifont! Migu\ 2M:h14
call GuiWindowMaximized(1)
```

フォント名に空白が含まれる場合はエスケープします。
画面を最大化して起動もここで指定できます。

ウィンドウサイズも指定できたと思います。

### terminalの設定

:terminal でシェルを実行できます。
デフォルトではcmdが起動しますが、PowerShellに変えることもできます。

```
set shell=powershell.exe
set shellcmdflag=-NoProfile\ -NoLogo\ -NonInteractive\ -Command
```

また、エスケープを押してもノーマルモードに戻れないので、Escキーにキーアサインを設定します。

```
tnoremap <silent> <ESC> <C-\><C-n>
```

WindowsにもOpenSSHの波がようやく到達したので、NeoVimから`vagrant ssh`もできますよ！

## 最後に

deinのインストールはinit.vimから記憶を頼りに書いたのであやふやな感じになってしまいました。

また、Windowsでの動作は確認していないプラグインも割とあったりします。
OSS全般、Windows対応のリソースは不足気味だそうで、Windowsユーザーの皆さん、ふるってご参加ください。
Issue立てるだけでも十分な貢献になります。