dein.vimでLanguageClient-neovimが正常に動作しない

neovimでdein.vimを使用してプラグインを管理しているのですが、deoplete.nvimにdependsオプションをつけてインストールをすると正常に動作しないという問題があったので、整理のために記事にします。

問題としては、vimrcを編集した直後にnvimを起動した際には正常にLanguageClient-neovimが読み込まれるが、2回目以降にはプラグインが読み込まれずLSPも起動しないとい>うもの。 deopleteのdependsオプションをコメントアウトしたり、dein#load_state()を利用せず毎回プラグインの設定を読み込むようにすると動作する。

環境

mac OS Catalina 10.15(19A602) nvim NVIM v0.5.0-nightly-8-gf79369d42 dein version 2.1

バージョンは以上の通りです。 nvim自体はhomebrewを利用してインストールしました。 以下に再現可能だった最小のvimrcを載せます。

githubでも公開しています。

init.vim

let s:dein_dir = expand('~/.cache/dein')
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)
let s:dein_toml = '~/.config/nvim/dein.toml'
call dein#load_toml(s:dein_toml, {'lazy': 0})

call dein#end()
call dein#save_state()
endif

if dein#check_install()
call dein#install()
endif

dein.toml

[[plugins]]
repo = 'Shougo/deoplete.nvim'
depends = 'hoge'

[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
rev = 'next'
build = 'cargo build'
hook_source = '''
augroup filetype_rust
  autocmd!
  autocmd BufReadPost *.rs setlocal filetype=rust
augroup END
let g:LanguageClient_serverCommands = {
  \ 'rust': ['rustup', 'run', 'nightly', 'rls'],
  \ }
let $RUST_BACKTRACE = 1
let g:LanguageClient_devel = 1
augroup LanguageClient_config
  autocmd!
  autocmd User LanguageClientStarted setlocal signcolumn=yes
  autocmd User LanguageClientStopped setlocal signcolumn=auto
augroup END
let g:LanguageClient_autoStart = 1
let g:LanguageClient_autoStop = 1
'''

deinはリポジトリに書かれている方法でインストールしました。

原因

これが原因とはっきりわかるものは正直ありません。 vimrcを編集した直後の起動では正常に動く。2回目以降の起動ではプラグインが正常に読み込まれない。 dein.tomlでdeoplete.nvimのdependsオプションをコメントアウトすると正常に動く。 dein#load_state()で判定をせずに毎回読み込むようにすると正常に動く。 g:LanguageClient_develを設定しないとvimrcを編集してもそもそも初回から動かない。

などなど、正確に原因を絞り切れていません。

対策

現状の対策としては、dein#load_state()で判定をせず毎回読み込むことによって動作させています。 でもそうすると起動時間が少し遅くなるので原因がわかったら直したいところです。

About the author

日本の大学を休学してスノーボードするためにノルウェーで1年間生活。腰椎分離症になってしまったため、現在は様子を見ながらニセコで滑っています。プロでもなんでもないですが、行けるとこまで行ってやろうと毎日滑ってます