vim8からneovimに移行したら変更点が多くて結構ハマった

## 1. neovimに移行した背景

僕はこれまでvim8を、以下の理由からいくつかのfeature付きで使用していました。

* lua --> neocompleteがこれ入ってないと動かないから
* clipboard --> yankの内容をクリップボード連携したかったから
* mouse --> vimでマウス操作がたまにしたくなるから

さらにvimtexでPDFと.texの相互ジャンプを有効にするため、clientserverもつけて再インストールしようとしたときに
Homebrewのアップデートで--withオプションが使えなくなっていることに気づき、これを機にneovimに移行しようと決意しました。[^1]
[^1]: [Homebrew 2\.0\.0リリース: Linuxbrewの統合](https://rcmdnk.com/blog/2019/02/08/computer-mac-linux-homebrew/#%E5%85%AC%E5%BC%8Fformula%E3%81%8B%E3%82%89%E3%81%AF%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F)

## 2. vimからの変更点

[Nvim documentation: vim\_diff](https://neovim.io/doc/user/vim_diff.html)
公式ドキュメントに載ってます。（またはneovim起動して`:help`。）

またこちらの記事も参考になりました。
[NeoVim、そしてdein\.vimへ \- Qiita](https://qiita.com/okamos/items/2259d5c770d51b88d75b)

### neovimはfeaturesが基本全部入り
vimでは、例えばluaやclipboard連携を使いたい場合、vim自体を`$ brew install vim --with-lua --with-clipboard`などfeature付きでインストールする必要があった。これがneovimではなくなった。

neovimの`:help feature-compile` によると、
>
  Nvim always includes ALL features, in contrast to Vim (which ships with
  various combinations of 100+ optional features). Think of it as a leaner
  version of Vim's "HUGE" build. This reduces surface area for bugs, and
  removes a common source of confusion and friction for users.

### いくつかのfeaturesが使えなくなる

もう一つ大きな変更点は、if_ruby, if_luaなどが使えなくなった点。

`:help nvim-features`
>
ARCHITECTURE ~
External plugins run in separate processes. |remote-plugin| This improves
stability and allows those plugins to work without blocking the editor. Even
"legacy" Python and Ruby plugins which use the old Vim interfaces (|if_pyth|,
|if_ruby|) run out-of-process.

`:help nvim-features-missing`
>
Missing legacy features
>
Some legacy Vim features are not implemented:
- |if_py|: vim.bindeval() and vim.Function() are not supported
- |if_lua|: the `vim` object is missing some legacy methods
- *if_perl*
- *if_mzscheme*
- *if_tcl*

自分はvimでneocompleteをつかっていたので、neovimでは使えなくなりました。
代わりにneovimのために設計されたdeopleteという補完プラグインがあるのでそれを使うことになります。


## 3. neocompleteとdeopleteを場合分けして使う

[Shougo/deoplete\.nvim: Dark powered asynchronous completion framework for neovim/Vim8](https://github.com/Shougo/deoplete.nvim)
公式ドキュメントを見て設定する。

※　vim8の場合は操作が異なるので注意してください。

deopleteはpython3を使用します。以下をインストール。
`pip3 --user --upgrade install neovim`

vim-plugの場合、init.vimに以下を追記

```vim

if has('nvim')
  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
```

```vim

let g:deoplete#enable_at_startup = 1
```


自分はpyenvを使用しているので、以下も追加。[^2]
[^2]: [pyenvで入れたPythonをNeoVimで使う \- Qiita](https://qiita.com/makerbox/items/9ac6be611f65785669ad)
`let g:python3_host_prog = $PYENV_ROOT . 'shims/python3'`

`:echo has('python3')`で1がかえってきたらOKです。

### 自分の設定
neosnippetの設定も合わせて載せています。
deopleteの細かい設定は`:help`を見る。

```vim

    " ** autocomplete & snippet
    if has("nvim")
        Plug 'Shougo/deoplete.nvim', {'do': ':UpdateRemotePlugins'}
    else
        Plug 'Shougo/neocomplete.vim' "強力なコード補間機能 neocomplcacheの後継
    endif

    Plug 'Shougo/neosnippet.vim' " スニペット補完plugin
    Plug 'Shougo/neosnippet-snippets' " デフォルトsnippet

```
```vim

" -----------------------------------------------
"  ** neocomplete / deoplete
if has ("nvim")
    "  deoplete.nvim
    " Use deoplete
    let g:deoplete#enable_at_startup = 1
    " pyenvで管理しているpython3を指定
    let g:python3_host_prog = $PYENV_ROOT . '/shims/python3'
    " <TAB>で選んで<Enter>で確定時に改行しない
    inoremap <expr><CR> pumvisible() ? deoplete#close_popup() : "<CR>"
endif

" <TAB> completion (デフォルトは<C-n>で次候補)
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
" -----------------------------------------------


" -----------------------------------------------
"  ** neosnippet
"" Plugin key-mappings.
" Note: It must be "imap" and "smap".  It uses <Plug> mappings.
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)
xmap <C-k>     <Plug>(neosnippet_expand_target)

" SuperTab like snippets behavior.
" Note: It must be "imap" and "smap".  It uses <Plug> mappings.
"imap <expr><TAB>
" \ pumvisible() ? "\<C-n>" :
" \ neosnippet#expandable_or_jumpable() ?
" \    "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"

" For conceal markers.
if has('conceal')
  set conceallevel=2 concealcursor=niv
endif

" neosnippet-snippetsのtex.snipを.latex拡張子だけじゃなく.tex拡張子できかせる
let g:tex_flavor='latex'
" -----------------------------------------------
```

## 4. +clientserverの代わりは`pip3 install neovim-remote`

[にわかVimmerがNeovimに乗り換えたら戸惑ったという話 \- 有馬総一郎のブログ](https://arimasou16.com/blog/2018/05/04/00256/)

この記事が参考になりました。

このあとvimtexの方でSyncTeXができるように設定する予定ですが、ここでは割愛します。

## 5. その他neovimの設定で地味にハマったところ

#### .vimrcとのシンボリックリンク

[neovimの設定ファイルとディレクトリの置き場 \- neovim/vim入門](http://kaworu.jpn.org/vim/neovim%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E7%BD%AE%E3%81%8D%E5%A0%B4)

最初この記事を参考にシンボリックリンクを貼って.vimrcとinit.vimを共有しようと思ったのですが、自分がdotfilesの管理にmackupを使っていることが影響してか、（もしくはシンボリックリンクの貼り方が悪いのか）リンクが思うように行かなかったので、同期は諦めました。

そのかわり、init.vimを育てていく際にできるだけvimへの後方互換性をもたせるために場合分け等を書くようにしていこうと思います。

#### clipboardの設定でエラー
clipboardの設定で、autoselectを有効にしているとエラーが出た。なくてもいいので削除。

※ autoselectが有効にできれば、マウスで範囲選択しただけでクリップボードにコピーされるのでたまに便利ですが、nvimではもうこの機能はサポートしないということでしょうか。

#### カラースキーマの適用
>
.zshrcに`export TERM=xterm-256color`を設定しないとだめ

という記事を見て自分も設定したところ、powerlineを使っているせいか逆に色設定が変になりました。
.zshrcに書いたのを消して一度コマンドラインで`echo $TERM`してみたところ、もともと`TERM=xterm-256color`になっていました。

なぜ.zshrcに追記するとおかしくなるのか不明ですが、とりあえずそのままでOKなのでそっとしています。

カラースキーマ関係でおかしい場合の対処法は以下記事にまとまってあり、役に立つと思います。

[Vim8とNeovimと私（Vim初心者） \- Qiita](https://qiita.com/ksm240/items/5cd62fdd15d95d21d173)



## 6. 使ってみて気づいたneovimのいいところ

[atom userがneovimへ\.\.\. \- Qiita](https://qiita.com/poccariswet/items/0a1ee4177350aec1d226)
とほぼ一緒ですが

* featuresが基本全部入りなのでvim8みたいにその都度インストールし直さなくていい。
* true colorやイタリックなどが反映されて以前よりきれいなターミナルになった。
* :terminal で組み込みのterminalが呼べる

あたりが今の所気づいた良いところです。

true colorについては以下記事を参考にしてください。

* [neovimでTrue Colorを使用してみる \- なにかの記録](https://mryyomutga.hatenablog.com/entry/2018/11/16/000316)
* [ターミナル環境 \(iTerm, vim, tmux\) をフルカラーで使う \- nakanishy's blog](https://blog.nakanishy.com/truecolor-vim.html)
* [True color in iTerm2 Tmux Neovim \| YUKIMEMI](http://yukimemi.github.io/post/2016-09-19_true-color-in-iterm2-tmux-neovim/)