Windows+gVim+dein.vim環境導入時「未知の関数です」と言われた

# 症状
新しくwinタブを買ったのでvimを入れようと、 http://www.vim.org/ からWindows版gvim80.exeをダウンロードした。（いつ間にかver8.0が出てた）
その時NeoBundleが非推奨になってdein.vimと言うものが出ていると知ったので、それを入れようとした。
[NeoBundle から dein.vim に乗り換えたら爆速だった話](http://qiita.com/delphinus/items/00ff2c0ba972c6e41542)
この記事を参考にして導入。

…
あれ、うまくいかない。
![未知の関数です：dein#load_state](https://qiita-image-store.s3.amazonaws.com/0/33728/a0f47026-fc47-145a-4786-e3196c4e8607.png)

ちょっとRaspbian[^1]にも入れて試してみるか。→すんなり入った。
じゃあ、Windowsかgvimか、そこらへんの環境とうまく合わないんだろうか。

[^1]: そのとき一番身近なlinux環境だったというだけです

# 調査
未知ってなんやねん。
プラグインのひとつとしてdein.vimが読み込まれていないみたい。確かに、ちょっと変な場所にdein.vim本体が入ってて、そこをruntimepathに追加しているんだけど、それがうまくいかないのかな。

```vim:_vimrc
" プラグインが実際にインストールされるディレクトリ
let s:dein_dir = expand('~\.cache\dein')
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . '\repos\github.com\Shougo\dein.vim'
" dein.vim がなければ github から落としてくる
if &runtimepath !~# '/dein.vim'
	if !isdirectory(s:dein_repo_dir)
		execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
	endif
	execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif
（後略）
```

[^2]: ちなみに-V2だけだとgvimではダイアログにログが出る。不便なので、-V2log.txtみたいにファイル出力した。
gvim -V2オプションで起動すると、抜粋して以下の感じ。[^2]

```bat:gvim　-V2（抜粋）
C:\Users\fuman\_vimrc の実行を継続中です
"autoload/dein.vim" を "C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim\,C:\Users\fuman/vimfiles,C:\Program Files (x86)\Vim/vimfiles,C:\Program Files (x86)\Vim\vim80,C:\Program Files (x86)\Vim/vimfiles/after,C:\Users\fuman/vimfiles/after" から検索中
'runtimepath' の中にはありません: "autoload/dein.vim"
"autoload/dein.vim" を "C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim\,C:\Users\fuman/vimfiles,C:\Program Files (x86)\Vim/vimfiles,C:\Program Files (x86)\Vim\vim80,C:\Program Files (x86)\Vim/vimfiles/after,C:\Users\fuman/vimfiles/after" から検索中
'runtimepath' の中にはありません: "autoload/dein.vim"
                                                     C:\Users\fuman\_vimrc の処理中にエラーが検出されました:
行  133:
E117: 未知の関数です: dein#load_state
E15: 無効な式です: dein#load_state(s:dein_dir)
"autoload/dein.vim" を "C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim\,C:\Users\fuman/vimfiles,C:\Program Files (x86)\Vim/vimfiles,C:\Program Files (x86)\Vim\vim80,C:\Program Files (x86)\Vim/vimfiles/after,C:\Users\fuman/vimfiles/after" から検索中
'runtimepath' の中にはありません: "autoload/dein.vim"
行  148:
E117: 未知の関数です: dein#check_install
E15: 無効な式です: dein#check_install()
$HOME\_vimrc の取込を完了
```


runtimepathにはパス`C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim\`が追加されてて、そこにちゃんと`autoload\dein.vim`も入ってる。なぜ認識しないんだろう？

ちょっとruntimepathの設定する文を変えてみる。

```vim:_vimrcその2
" プラグインが実際にインストールされるディレクトリ
let s:dein_dir = expand('~\.cache\dein')
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . '\repos\github.com\Shougo\dein.vim'
" dein.vim がなければ github から落としてくる
if &runtimepath !~# '/dein.vim'
	if !isdirectory(s:dein_repo_dir)
		execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
	endif
	"execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')        "いったんコメントアウト！
	set runtimepath^=~/.cache/dein/repos/github.com/Shougo/dein.vim/         "追加。
endif
（後略）
```

```bat:gvim　-V2その2
C:\Users\fuman\_vimrc の実行を継続中です
"autoload/dein.vim" を "C:\Users\fuman/.cache/dein/repos/github.com/Shougo/dein.vim/,C:\Users\fuman/vimfiles,C:\Program Files (x86)\Vim/vimfiles,C:\Program Files (x86)\Vim\vim80,C:\Program Files (x86)\Vim/vimfiles/after,C:\Users\fuman/vimfiles/after" から検索中
行 134: C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim\autoload\dein.vim を取込中
C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim\autoload\dein.vim の取込を完了
```

`C:\Users\fuman/.cache/dein/repos/github.com/Shougo/dein.vim/`は良いのか。途中から`\`が`/`になってるくらいしか違わないんだが

***

そんな感じで何パターンか試していると、
`C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim\` → NG
`C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim`  → OK
`C:\Users\fuman\.cache\dein\repos\github.com\Shougo\dein.vim/` → OK
となり、どうやら末尾が`\`だとruntimepathとしてうまく認識しないっぽい。`\,`とつながるところがエスケープ文字になっちゃうのか。
でも、`fnamemodify()`の`:p`オプションでそんな文字が自動的に追加されてしまうのってどうなの…

# 最終的に
`fnamemodify()`をまんま抜く形でうまくいきました。
~~フルパスに展開しなくていいのか？と思ったけど、読めてるからいいや。
たぶん見る人が見たら汚いんだろうなあ。~~
コメントで指摘いただきました。`expand('~\.cache\dein')`で展開しているので問題なさそうです。

```vim:_vimrc
"""
" Dein TOML
" プラグインが実際にインストールされるディレクトリ
let s:dein_dir = expand('~\.cache\dein')
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . '\repos\github.com\Shougo\dein.vim'
" dein.vim がなければ github から落としてくる
if &runtimepath !~# '/dein.vim'
	if !isdirectory(s:dein_repo_dir)
		execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
	endif
	"execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
	execute 'set runtimepath^=' . s:dein_repo_dir   "変更点
endif
" 設定開始
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)
  " プラグインリストを収めた TOML ファイル
  " 予め TOML ファイル（後述）を用意しておく
  let g:rc_dir    = expand('~/vimfiles/rc')      "ここも .vim → vimfiles に変えた
  let s:toml      = g:rc_dir . '/dein.toml'
  let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'
  " 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
```

`fnamemodify()`使ってwindows環境でruntimepathに書く、っていう組み合わせが相性悪いんですかねえ。なんかdein.vimに限らず色んな所で起こりそうな気がする。