雑魚Vimmerが[NeoBundle → dein]と[Mac → Windows]の同時の移行ではまったこと(ほぼリンク集)

# 対象者

 - WindowsでもVimを使いたい人
 - NeoBundleからdeinへの移行を考えている人
 - vimrcをがっつりう触るのが久しぶりでいろいろ忘れてしまった人

# はまりポイント

 - NeoBundleが非推奨...だと
 - tomlってなんだ
 - Windowsって.vimrcじゃなくて_vimrcなんだよね...？
 - vimprocをビルドする必要があるらしいのだが。。。

## Windowsって.vimrcじゃなくて_vimrcなんだよね...？

　ざっくりいうと、<strong>`.vimrc`も`_vimrc`もWinでもMacでも読み込まれる</strong>ようです。
ただ、優先順位が逆になっているようです。

　一方で、`.vim`ディレクトリはWinではデフォルトでは読み込まれないようで、代わりに`vimfiles`というディレクトリにする必要があります。この辺りは、MacとLinuxでvimの設定ファイルを共有するときに考慮する必要が出てくるようですが、とりあえず移行する分にははまるほどではありません。まとめると以下のようになります。

|               |Windows   |Mac/Linux  |
|---------------|----------|-----|
|vimrc          |_vimrc優先|.vimrc優先|
|.vim/vimfiles  |vimfilesのみ|.vimのみ  |

もう少し細かい話は、[このサイト][vimrc-ref-1]を参考にするとよいと思います。

## NeoBundleが非推奨...だと

　「NeoBundleはもう非推奨だからdein.vimを使おう！」というお話はよく目にしていたのですが、「別に不満なく使っているしなぁ」という感じで移行が進んでいませんでした。

　Macでしか使ったことのなかったVimの環境をWindowsで構築する必要が出てきたタイミングでdeinへの移行も挑戦してみました。「NeoBundleからdeinへの移行」系の記事を見てると簡単そうに見えたのでやってみましたが、実際には、vimprocのビルドがわからなかったり、tomlがよくわからなかったりで苦労しました。

## tomlってなんだ
　toml自体については、[この記事][toml-ref-1]に詳しいです。今回での利用に関しては、

|               |*.vim   |*.toml  |
|---------------|----------|-----|
|vim自体の設定   | ○ |×|
|pluginの設定    | △ |○  |

というように、<strong>vim自体の設定とpluginの設定を分離させること</strong>と<strong>記述が簡単なこと</strong>が大きなメリットのようです。[こちらの有名な記事][toml-ref-2]を参考にしてもらえれば、実際の使い方もよくわかると思います。

　例えば、`molokai`のインストールは以下の記述だけでOKです。

```vim:dein.toml
[[plugins]]
repo = 'tomasr/molokai'
```

## vimprocをビルドする必要があるらしいのだが。。。

　~~ほとんどの人はプラグインでvimprocを使っていると思いますが、Macの時と違ってWindowsでは、vimprocのビルドとその設定の記述に注意が必要です。deinへの移行やtomlに気を捕らわれててここを見落とすということもあるかもしれません。~~

訂正: 以下のコメントいただきました。こちらのコメントの通り、リンク先からダウンロードできます。つまり<strong>事前の自前ビルドは不要</strong>ということです。ちゃんと公式にありましたね。。。

訂正2: コメントで書いてくださっていますが、自動でダウンロードをしてくるオプションもあるとのことです!

>Windows版のDLLは公式リポジトリで公開されていますので、ビルドは不要です。 https://github.com/Shougo/vimproc.vim/releases
Cygwinでビルドすると、Windows用ではなく、Cygwin専用のDLLができますので注意が必要です。



### MinGWのインストール

　~~vimprocを使えるようにするには、`make`してあげる必要がありますが、デフォルトではWindowsにそのようなものは入っていません。そこで、MinGWをインストールしてビルドする必要があります[^1]。その方法に関しては[こちら][mingw-ref-1]を参考にすることで出来ると思います。~~



[^1]: WindowsでもCygwinを導入していれば、Cygwinに入っている`make`を使うこともできるようです。追記: コメントをいただきましたが、CygwinでビルドするとCygwin専用のDLLができるようで注意が必要とのことです。

### 設定ファイルへの記述

　NeoBundleを使っていた方は、以下のような記述を設定ファイルにしていたと思います。

```vim:NeoBundleでの設定(vimファイル)
NeoBundle 'Shougo/vimproc.vim', {
\ 'build' : {
\     'windows' : 'tools\\update-dll-mingw',
\     'cygwin' : 'make -f make_cygwin.mak',
\     'mac' : 'make',
\     'linux' : 'make',
\     'unix' : 'gmake',
\    },
\ }
```

これは、[公式のドキュメント][setting-ref-1]と同じものですが、ここでOSによってどのmakeを使うかが指定されています。`'build': 'make'`だけになっている人もたまにいるみたいですが、Macの時でOSの違いを考えない場合は、それでも良いのですが、<strong>Windowsへの移行するときには必ず修正</strong>するようにしましょう。

　そして、dein.vimへ移行する場合には、次のように書き換えればOKです[^2]。

```vim:dein.vimでの設定(tomlファイル)
[[plugins]]
repo = 'Shougo/vimproc.vim'
hook_post_update = '''
  if dein#util#_is_windows()
    let cmd = 'tools\\update-dll-mingw'
  elseif dein#util#_is_cygwin()
    let cmd = 'make -f make_cygwin.mak'
  elseif executable('gmake')
    let cmd = 'gmake'
  else
    let cmd = 'make'
  endif
  let g:dein#plugin.build = cmd
'''
```

[^2]: `build`オプションを使うこともできるようですが、OSによって変えることは難しそうです。

# まだはまっていること → 解決

## 不可視文字の表示設定でエラー

　不可視文字の表示をさせようとして、Mac時代にはうまく動いていた以下のコードを実行しようとするとエラーが出てうまくいっていません。

```vim:.vimrc
set listchars=tab:≫-,trail:-,extends:≫,precedes:≪,nbsp:%,eol:? " NG
set listchars=tab:\≫\-,trail:\-,extends:\≫,precedes:\≪,nbsp:\%,eol:\? " escape的なことをしてもNG
```

```text:エラー内容
E474: 無効な引数です: listchars=tab:<81><e2>-,trail:-,extends:<81><e2
>,precedes:<81><e1>,nbsp:%,eol:? " 上の方のエラー
E474: 無効な引数です: listchars=tab:\<81><e2>\-,trail:\-,extends:\<81><e2
>,precedes:\<81><e1>,nbsp:\%,eol:\? " 下の方のエラー
```

~~文字コード関係のエラーだと思われませんがよくわかっていません。~~

コメントを頂いたので、コメントを基に以下のように調査し対応しました。([k-tanaka][k-tanaka]さん、ありがとうございます！)

### 文字コード修正

>文字コードが合っていないように見えます。

ということで、まず、いただいたコメントの通り次のようになっていることを確認しました。

```
set encoding=utf-8
scriptencoding utf-8
```

### listcharsで設定する全ての文字は幅が1でなければならない

>ただ、listchars には全角幅の文字は使用できません。"≫" が全角幅で表示されるフォントを使用しており、set ambiwidth=double の設定をしている場合は、エラーとなります。

とコメントを頂いたので、改めて[Vim日本語ドキュメント][vim-doc]で検索して確認しました。(最初からするべきだったと反省もしつつ。。。)

すると、[listcharsオプションの説明部分][doc-listchars]に以下のような記述がありました。

>文字 ':' と ',' は使えない。'encoding' が "utf-8" のときはUTF-8の文字
        が使える。そうでないときはprintableな文字 {訳注: 文書先頭を参照} だけ
        が使える。全ての文字は幅が1でなければならない。

正直、文字コードの話とかフォントの話は理解していないことが多いのですが、<strong>文字の幅が1でないようなものはlistcharsの文字として設定できない</strong>ことはわかりました。

### 解決まで

上記のように`encoding`と`scriptencoding`の設定を確認して、`ambiwidth`も`single`にして準備は整ったと思い、utf-8の"≪"を入力することでうまくいくかと思うとうまくいきませんでした。実は、私のケースでは

```vim:.vimrc
set fileencoding=utf-8
```

を抜かしていため、.vimrcの保存時に別コードに変換されていたようです。これでようやく次のコードで問題なくlistcharsが設定できました。

```vim:.vimrc
set listchars=tab:≫-,trail:-,extends:≫,precedes:≪,nbsp:%,eol:?
```



[toml-ref-1]: https://qiita.com/b4b4r07/items/77c327742fc2256d6cbe
"設定ファイル記述言語 TOML"
[toml-ref-2]: https://qiita.com/delphinus/items/00ff2c0ba972c6e41542
"NeoBundle から dein.vim に乗り換えたら爆速だった話"
[mingw-ref-1]: https://qiita.com/akase244/items/ce5e2e18ad5883e98a77
"Windows(64ビット環境)でvimprocをコンパイルしてみよう"
[setting-ref-1]: https://github.com/Shougo/vimproc.vim/blob/master/README.mkd
"vimproc-README.mkd"
[vimrc-ref-1]: http://teppeis.hatenablog.com/entry/20080705/1215262928
 "vimrc, runtime の優先順位を理解して Windows と Linux で Vim の設定を共有する"
[k-tanaka]: https://qiita.com/k-takata
"https://qiita.com/k-takata"
[vim-doc]: http://vim-jp.org/vimdoc-ja/
"Vim日本語ドキュメント"
[doc-listchars]: http://vim-jp.org/vimdoc-ja/options.html#'listchars'
"Vim日本語ドキュメント-listchars"