LoginSignup
12
9

More than 3 years have passed since last update.

NeoVim+coc.nvimでLSPによるGoの補完を実現する

Posted at

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プラグインを管理しているので、末尾に以下を加える。

dein.toml
[[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に従って以下の設定を加えた。

coc-settings.json
{
  "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.gopackage mainを書いて再読み込みすると無事補完機能の動作を確認できた。

GOPATH下以外でも補完が効くようにする

GO111MODULE=onにすると、Go1.11のmodules機能が有効になり、GOPATHの外でプロジェクトを扱える。
.bashrcなどにexport GO111MODULE=onの設定を追記すし、GOPATH下でやったのと同じ作業を行うと、GOPATHの外のファイルでも補完が効くことを確認できた。

まとめ

coc.nvimそれ自体の設定は簡潔で、設定ファイルもJSONなので扱いやすい。
今回はGo特有の問題で詰まったが、そもそも私自身Go経験が浅いのでGoのプロだったら特に躓かずに補完が効くところまでいけると思う。
coc.nvim導入にあたり、相性のよくないプラグインやもともと補完を担っていたプラグインがリストラされ、プラグイン数の削減にも繋がった。
補完速度も上々なので、コーディングが捗りそう。

毎回package main書いてリロードするのは面倒なのでなにかいい方法あったら誰か教えてください。

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9