Go 言語開発時に Vim の補完機能が上手く動作しないことが増えており非常にストレスフルな状態が続いていました。そこで最近話題の LSP (Laugnage Server Protocol) ベースの補完に移行することにしました。

設定方法

主に vim-lsp とオートコンプリート機能を提供する asyncomplete.vim を vimrc ファイルに追加し各言語に対する Language Server の設定を追加していきます。

"Plug でプラグインを管理する場合
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'

Go 言語の場合は続けて次の設定を追加します。その他の言語については vim-lsp の wiki に対応方法が書いてあります。

if executable('go-langserver')
  augroup LspGo
    au!
    au User lsp_setup call lsp#register_server({
          \ 'name': 'go-langserver',
          \ 'cmd': {server_info->['go-langserver', '-gocodecompletion']},
          \ 'whitelist': ['go'],
          \ })
    au FileType go setlocal omnifunc=lsp#complete
  augroup END
endif

この設定を動作させるためには go-langserver のインストールが必要です。

$ go get -u github.com/sourcegraph/go-langserver

ハマったところ

最初は gopls を利用しようとしましたが, 私の環境では上手く動作しなかったため star 数が多い go-langserver を利用するようにしました。

参考

Big Sky :: gocode やめます(そして Language Server へ)