NeoVimでLSP(Language Server Protocol)を使ったら、定義ジャンプなどが劇的に早くなった


こんにちわ

vim8を使ってgoのコーディングをしていたのですが、
マシンパワー不足&なぜかvimが重たくて、定義ジャンプなどが遅いのがかなりストレスだったので、
なんとか改善できないかと試行錯誤した結果、かなり早くになったので同じ状況に悩んでいる方がいたらぜひ試してみてください。

アジェンダ

vim-goとLSPのスピード差異

  • vim-go

  • LSP(Language Server Protocol)

vim-goによるジャンプがもっさりしているのに対して、
LSPはサクッとジャンプしているのは一目瞭然ですね。

ちゃんと調べていないのですが、vim-goの重たい原因はおそらくguruの範囲設定かと。

環境

  • 機体
    MacBook Early 2015
    CPU 1.2 GHz Intel Core M
    メモリ 8 GB 1600 MHz DDR3

  • OS
    MacOS Mojave

  • Editor
    Neovim 0.3.1
    ※vim8でもLSP動きました

  • Plugin
    dein
    vim-lsp
    vim-async

導入

LSPを導入するには以下の様に設定するだけです。
設定ファイルはこちらにあります。

  • dein.toml
[[plugins]]
repo = 'prabirshrestha/async.vim'

[[plugins]]
repo = 'prabirshrestha/vim-lsp'
  • init.vim
let mapleader = "\<Space>"

" 中略...

if executable('go-langserver')
    au User lsp_setup call lsp#register_server({
        \ 'name': 'go-langserver',
        \ 'cmd': {server_info->['go-langserver', '-mode', 'stdio']},
        \ 'whitelist': ['go'],
        \ })
endif

nmap <silent> <Leader>d :LspDefinition<CR>
nmap <silent> <Leader>p :LspHover<CR>
nmap <silent> <Leader>r :LspReferences<CR>
nmap <silent> <Leader>i :LspImplementation<CR>
nmap <silent> <Leader>s :split \| :LspDefinition <CR>
nmap <silent> <Leader>v :vsplit \| :LspDefinition <CR>

LSPのメリットとデメリット

  • メリット
    見ての通り、マシンのパワーがなくてもそれなりに早く動くところが最大のメリットだと思っています。

  • デメリット
    vim-goはgo rungo vetgo lintなど機能が豊富ですが、LSPは現時点で以下の事しかできないようです。

主にコーディング時に使用する

  • 定義ジャンプ(画面分割も含め)
  • インターフェイス実装検索
  • 定義箇所検索

くらいかと思うので、vim-goの機能と組み合わせればそれなりにコーディングスピードが上がるのではないかなと。
:LspNextErrorなどがあるようですが、いまいち使い方が分かっていないので知っている方いましたら教えて頂けると喜びます。

最後に

LSPが今後もっといろんな事ができるようになって行くと良いなと思いながら、気長に待とうと思います。
ちなみにvimでgoを書いている方で、こうすればもっと小コーディング捗るというのがあれば教えて頂けると喜びます。
なにどぞ…