僕はGolangで開発する際、Neovimを使用しています。
Golangのバージョンアップに伴い、gocodeによる補完がうまく動かなくなったりと色々と問題が発生したので、プラグインや設定の見直しを行いました。その際の備忘録を書いていきます。
前置き
プラグインマネージャーにはdeinを使わせてもらっているので、他のツールを使っている方は適宜読み替えていただけると助かります。
メインで利用するプラグインは以下の通りです。
以前まではvim-goのみで補完や文法チェック、フォーマッティングまで全部お任せできていたのですが、上述したようにgocodeを利用した補完が難しくなったため、LSP(Language Server Protocol)に一部機能を任せる形に設定しています。
Golangにおけるgocode/LSPについての経緯・情報については以下の記事を参考にさせていただきました。ありがとうございます。
https://mattn.kaoriya.net/software/lang/go/20181217000056.htm
※追記:ちなみに最近見つけたcoc.nvimという補完ライブラリがLSPクライアントとしても非常に優秀でした。気になる方はぜひ試してみてください。
各種プラグイン設定
vim-go
特に特別な設定は行なっていませんが、LSPを導入することによって不要になる機能でキーマッピングがぶつかるものを無効化しています。
[[plugins]]
repo = 'fatih/vim-go'
hook_add = '''
" 保存時に必要なimportを自動的に挿入
let g:go_fmt_command = "goimports"
" LSPに任せる機能をOFFにする
let g:go_def_mapping_enabled = 0
let g:go_doc_keywordprg_enabled = 0
'''
LanguageClient-neovim/deoplete
deopleteについても特に特別な設定は行なっていません。
NeovimのLSPクライアントの設定も基本的には公式のREADMEに沿った形です。
languageサーバーにはgo-langserverを設定している例が多いですが、内部ではgocodeが使われているとのことですので、Golang公式がサポートしているというgoplsを設定しています。
そのため設定を変更する前にgoplsを取得しておきます。
go get -u golang.org/x/tools/cmd/gopls
[[plugins]]
repo = 'Shougo/deoplete.nvim'
on_event = 'InsertEnter'
hook_add = '''
let g:deoplete#enable_at_startup = 1
'''
[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
build = 'bash install.sh'
rev = 'next'
hook_add = '''
set hidden
let g:LanguageClient_serverCommands = {
\ 'go': ['gopls']
\ }
let g:LanguageClient_loadSettings = 1
nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR>
'''
ちなみにbingoというLanguageサーバーも完成度が高く、快適に利用出来るので、気になる方は一度試してみることをオススメします。
※上で紹介したbingoについては開発の継続がされなくなりましたので、goplsを使うようにした方が良さそうです。
まとめ
自分自身まだ調べながら試行錯誤中ですので、より良い設定が見つかれば随時更新していきたいと思います。
記載内容に誤りがあったり、これも記載しておいた方がいいという点などございましたら、ご指摘いただけると助かります。