Carpe Diem

備忘録

vim-goからvim-lspへ移行しました

概要

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/async.vim'
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を使う上では最初の4つを入れておきましょうというのと、残りの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さんに本当感謝です。

ソース