読者です 読者をやめる 読者になる 読者になる

クマーなひとときv2

雑多なメモ。twitterで書ききれないもの等。

dein.vimインストール時にset shellslash忘れててエラーになった話

確認用に1からvimrc書いた時、set shellslash書き忘れてて、
「何でエラーなるんだああああ」ってなったのでメモ。

問題のvimrc

filetype plugin indent on
let $MY_VIMRUNTIME = $VIM . "/vimfiles"

if &compatible
  set nocompatible
endif
let s:dein_dir = expand('$MY_VIMRUNTIME/dein')
let g:dein#install_log_filename = s:dein_dir . '/dein.log'
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
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
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)
call dein#add('Shougo/dein.vim')
call dein#add('Shougo/denite.nvim')
call dein#end()
call dein#save_state()
endif
if dein#check_install()
  call dein#install()
endif

filetype plugin indent on

発生した問題

dein.vimインストール完了のダイアログが出た後、以下のエラーになる。

_vimrcの処理中にエラーが検出されました:
行   17:
E117: 未知の関数です: dein#load_state
E15: 無効な式です: dein#load_state(s:dein_dir)
行   24:
E117: 未知の関数です: dein#check_install
E15: 無効な式です: dein#check_install()

インストールされたはずのdein.vimが見えてない模様。

原因

多分、パスに、(バックスラッシュ)と/(スラッシュ)が混在していること。
vimだとなんだけど、ブラウザで見るとになるから、くっそ見にくい。

  runtimepath=~\Downloads\tmp\vim80-kaoriya-win64\vimfiles\dein/repos/github.com/Shougo/dein.vim\,~/vimfiles

expand()で\vimfiles\deinまで展開されて、以降は直接文字連結してるから、/区切りで入る。

let $MY_VIMRUNTIME = $VIM . "/vimfiles"
let s:dein_dir = expand('$MY_VIMRUNTIME/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

解決手段

  1. set shellslashを設定する。これにより、vimによって/に変換される。

  2. 区切り文字に/を指定している箇所を、全てに変更する。

  3. set runtimepathしてる所を以下の通り変更する。

execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p:gs?\\?/?')

要は、使われる区切り文字が統一されてれば大丈夫、と思う。


普段なんとなく設定してたけど、Windows環境では便利なオプションだなぁ、と、
再認識したわけでした。