500番煎じくらいだけどcoc.nvimの記事は多くなかったので備忘録
前提
- NeoVim(v0.3.7)
- プラグイン管理はdein.vim
- LSはgopls
Install coc.nvim
Insatll Node.js & Yarn
coc.nvimのREADME通り
$ curl -sL install-node.now.sh/lts | sh
YarnはREADMEを無視して普通にインストールしてしまったが問題なかった
$ npm install -g yarn
extension用のディレクトリを作成
Vimを開いた状態で:CocInstall [extention]
するとNodeモジュールがインストールされる。
JavaScriptやJSONの補完やSyntaxが効くようになるありがたい拡張機能もある。
これらをインストールするディレクトリがないとエラーを吐くらしい(未確認)ので念の為ディレクトリを作っておく。
$ mkdir -p ~/.config/coc/extensions
dein.vimにプラグインを追加
私はtomlファイルでVimプラグインを管理しているので、末尾に以下を加える。
[[plugin]]
repo = 'neoclide/coc.nvim'
build = './install.sh nightly'
Vimを開くとインストールが始まり、完了後はcompiled javascript file not found
と出る。
Vim内で以下実行することでエラーは消える。
:call coc#util#install()
:CheckHealth
でcoc.nvimの状態が全てOKになっていれば終わり
参考
neovim + coc.nvim で LSP
Vimの補完プラグインであるcoc.nvimが強すぎる。
Goの補完設定をする
:CocConfig
でcoc.nvimの設定ファイルが開く。このとき、JSON用の拡張もインストールされる(されてなければ)。
公式Wikiに従って以下の設定を加えた。
{
"suggest.noselect":false,
"suggest.preferCompleteThanJumpPlaceholder":true,
"languageserver": {
"golang": {
"command": "gopls",
"rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"],
"filetypes": ["go"]
}
}
}
補完が出ない...
coc-settings.json
ではJSON用の補完が出ていたので、設定ファイルの記述ミスか、Go由来の問題。
PATHの確認をする
// デフォルトは$HOME/go
$ echo $GOPATH
// $GOPATH/bin
$ echo $PATH
パスが通っていなかったら設定ファイルに追記する。
# 記述順序に注意
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
goplsのインストール
goplsはbingoの作者がgoplsをForkしてbingoの機能を追加したパッケージとGoogleが出している公式のパッケージがある。
coc-nvimのWikiにはbingo版での設定方法が書かれているが、今回は公式のパッケージを使う。
$ go get -u golang.org/x/tools/cmd/gopls
// $GOPATH/bin/goplsが表示される
$ which gopls
GOPATH下で作業する
GOPATH/srcに任意のディレクトリとmain.go
を作成したが、やはり補完されない。
package main
がないとサーバーがErrorを返してくる。
main.go
にpackage main
を書いて再読み込みすると無事補完機能の動作を確認できた。
GOPATH下以外でも補完が効くようにする
GO111MODULE=on
にすると、Go1.11のmodules機能が有効になり、GOPATHの外でプロジェクトを扱える。
.bashrc
などにexport GO111MODULE=on
の設定を追記すし、GOPATH下でやったのと同じ作業を行うと、GOPATHの外のファイルでも補完が効くことを確認できた。
まとめ
coc.nvim
それ自体の設定は簡潔で、設定ファイルもJSONなので扱いやすい。
今回はGo特有の問題で詰まったが、そもそも私自身Go経験が浅いのでGoのプロだったら特に躓かずに補完が効くところまでいけると思う。
coc.nvim導入にあたり、相性のよくないプラグインやもともと補完を担っていたプラグインがリストラされ、プラグイン数の削減にも繋がった。
補完速度も上々なので、コーディングが捗りそう。
毎回package main
書いてリロードするのは面倒なのでなにかいい方法あったら誰か教えてください。