概要
vim-goからvim-lspへ移行する時に問題になってたところを全部mattnさんが解決してくださってたのでようやく完全移行したという話です。
環境
- vim 8.2
- go 1.13.5
これまでの課題
vim-goの問題点
2014年からgoを触っていましたが当時はvim-go一択で、しかもやりたいことはそれだけで事足りていました。
しかし時代は流れ、以下のように少しずつモヤモヤを感じるようになってきました。
- 1.10のビルドキャッシュ辺りでバグがちょこちょこ起きたり
- 機能が増えてきて重くなったり
- Language Server Protocolの機運が高まってきた(色んなエディタやIDEが対応してきた)
vim-lspの問題点
vim-lsp自体はLanguage Server Protocolが話題に挙がった頃から何度か試してみたのですが、
- 初期はサポートしている機能が限定されていた
- LSP用の設定が分かりにくい
- ネットにある情報がvimじゃなくてNeovimだったり
- 古い情報が氾濫して何が正しいか分かりにくい
- vim-lspではコード整形が重いし保存時にgoimportしてくれない
といった問題で毎回挫折していました。
やったこと
.vimrcに以下を書きました。
Pluginの指定
call plug#begin('~/.vim/plugged') Plug 'prabirshrestha/asyncomplete.vim' Plug 'prabirshrestha/asyncomplete-lsp.vim' Plug 'prabirshrestha/vim-lsp' Plug 'mattn/vim-lsp-settings' Plug 'mattn/vim-goimports' call plug#end()
とりあえずvim-lspを使う上では最初の3つを入れておきましょうというのと、残りの2つはより簡単に使うためのプラグインです。
mattn/vim-lsp-settings
元々vim-lspでは
if executable('gopls') au User lsp_setup call lsp#register_server({ \ 'name': 'gopls', \ 'cmd': {server_info->['gopls']}, \ 'whitelist': ['go'], \ }) autocmd BufWritePre *.go LspDocumentFormatSync endif
ref: https://github.com/prabirshrestha/vim-lsp/wiki/Servers-Go
といった感じで言語ごとにLSPの設定を書く必要がありました。
しかしmattn/vim-lsp-settingsはプラグインを入れるだけで、これらを自動でよろしくやってくれる&殆どの言語をサポートしてくれます。
詳細を知りたい方は以下↓
Big Sky :: Vim をモダンな IDE に変える LSP の設定
mattn/vim-goimports
mattn/vim-goimportsは:w
で保存した時に
- コード整形
- goimport
してくれます。
これを入れる前はLSPのコード整形機能を使って
autocmd BufWritePre <buffer> LspDocumentFormatSync
としていましたが非常に重いのでまだまだ実用的じゃなかったです。
LSPの設定
vim-go
でできたようなショートカットを一部設定し、Diagnostics(診断=エラーチェック)の設定などを。
g:lsp_text_edit_enabled
は気づいたら閉じカッコが消えるといった挙動があったのでオフにしてます。まだまだこれから改善される機能とのこと。
nmap <silent> gd :LspDefinition<CR> nmap <silent> <f2> :LspRename<CR> nmap <silent> <Leader>d :LspTypeDefinition<CR> nmap <silent> <Leader>r :LspReferences<CR> nmap <silent> <Leader>i :LspImplementation<CR> let g:lsp_diagnostics_enabled = 1 let g:lsp_diagnostics_echo_cursor = 1 let g:asyncomplete_popup_delay = 200 let g:lsp_text_edit_enabled = 0
まとめ
これまで何度も挫折していたvim-lsp移行がようやく完了しました。
mattnさんに本当感謝です。