エラーコード「Vim:E119」を関連ライブラリのバージョンアップで対処してみた

neovimで久々にScalaを触っていたところ、coc.nvimが正常に動作していないことに気が付きました。エラーコードを見ても対処方法に検討がつかなかったものの、どうやら正常な状態にまで至れたのでその過程をまとめました。
2020.12.08

はじめに

Scalaコードの編集にIntelliJとneovimを併用しており、依存モジュールの検証にはIntelliJを、単純な編集にはneovimと使い分けています。

neovimで編集する際にはcoc.nvimを併用していたのですが、ふと拡張機能を確認しようと:CocList extentionと実行してみたところうんともすんとも言いません。まさかと思い、:CocCommandも試してみましたが反応しません。

そこで、試しに:CocConfigを実行してみると、設定ファイルが開きました。つまり、拡張機能が死んでいる。

同じような状況に陥った人はいるのかと検索してみたところ、Gitterのcoc.nvimチャンネルにログがのこっていました。ただ、誰も反応していなかったので解消は出来ていなかったようです。

素のvimで編集していた状態と変わらないため、便利なIntelliJに一本化することも考えました。が、ものは試しと弄ってみた結果、正常に動作したようです。過程について書き残してみました。

Vim:E119: 関数の引数が足りません: coc#util#get_bufoptions

発生したエラーについて先に挙げておきます。

Error on create buffer: Error: request error nvim_call_function - Vim:E119: 関数の引数が足りません: coc#util#get_bufoptions
    at transport.request (~/.cache/dein/repos/github.com/neoclide/coc.nvim/node_modules/@chemzqm/neovim/lib/api/Base.js:40:32)
    at pending.set (~/.cache/dein/repos/github.com/neoclide/coc.nvim/node_modules/@chemzqm/neovim/lib/transport/nvim.js:116:13)
    at NvimTransport.parseMessage (~/.cache/dein/repos/github.com/neoclide/coc.nvim/node_modules/@chemzqm/neovim/lib/transport/nvim.js:57:17)
    at DecodeStream.NvimTransport.decodeStream.on (~/.cache/dein/repos/github.com/neoclide/coc.nvim/node_modules/@chemzqm/neovim/lib/transport/nvim.js:27:18)
    at DecodeStream.emit (events.js:198:13)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)
    at DecodeStream.Readable.push (_stream_readable.js:224:10)
    at DecodeStream.Transform.push (_stream_transform.js:151:32)
    at DecodeBuffer.DecodeStream.decoder.push (~/.cache/dein/repos/github.com/neoclide/coc.nvim/node_modules/msgpack-lite/lib/decode-stream.js:24:12)

とりあえず、とても面倒な状況になったことだけは理解しました。forkして弄るにも、型が違うならまだしも引数が足りない状況です。

おなじエラーコードになった例についても検索して見つけました。

9月 13 2019 02:43 Hey, many thanks for the program. I am getting this error currently: Error: request error nvim_call_function - Vim:E119: Not enough arguments for function: coc#list#create

これに対するレスポンスは見つからず。自力でなんとかする必要があるということです。

バージョン更新を試みる

:CocInstallで追加インストールしたものがいずれも機能していないことから、各プラグインは横においておき、機能させるために必要なライブラリに焦点を絞りました。最低限、以下3つのライブラリで動作の整合性が維持されなければなりません。

  • neovim
  • coc.nvim
  • metals

久々に更新を行い、結果以下の通り。

% brew upgrade neovim
Warning: neovim 0.4.4 already installed
% coursier bootstrap \
  --java-opt -Xss4m \
  --java-opt -Xms100m \
  --java-opt -Dmetals.client=vim-lsc \
  org.scalameta:metals_2.12:0.9.7 \
  -r bintray:scalacenter/releases \
  -r sonatype:snapshots \
  -o /usr/local/bin/metals-vim -f
Wrote /usr/local/bin/metals-vim
% metals-vim --version
metals 0.9.7

# Note:
#   supported Scala versions: 0.26.0, 0.27.0-RC1, 2.11.12, 2.12.10, 2.12.11, 2.12.12, 2.12.8, 2.12.9, 2.13.0, 2.13.1, 2.13.2, 2.13.3, 2.13.4, 3.0.0-M1, 3.0.0-M2

残るはcoc.nvimですが、deinでの更新を行ってもバージョンがそのままのようで、dein.tomlの設定を変更しました。

before after
[[plugins]]
repo = 'neoclide/coc.nvim'
source = 'release'
build = 'coc#util#install()'
[[plugins]]
repo = 'neoclide/coc.nvim'
rev = 'release'
on_ft =['python', 'scala']
on_i = 1
merged = '0'
hook_source = '''
source ~/.config/nvim/plugins/coc.rc.vim
'''

大きな違いとしては rev に release と指定した辺り。それまでは最新を引っ張っていなかったはずです。

結果

無事コマンドが実行できるようになりました。

あとがき

更新の手間がそれなりにあるものの、一度正常になってしまえば後は調整あるのみです。

滅多にないかもしれませんが、同等のエラーに遭遇した場合の参考になれば幸いです。