LSPがとっても便利なのでNeovimで使う

このエントリーをはてなブックマークに追加

VimとLSPの組み合わせがとっても良かったのでメモ。

LSPとはなんぞや

マイクロソフトによって提唱された「プログラミング支援機能の共通言語」。補完その他の便利機能をローカルに立ち上げた言語サーバとエディタがやり取りするという形で行う。

そのやり取りに使われている言語がLSP(Language Server Protocol)。\

これを共通化しておけば、各言語・各エディタにその言語を処理できる仕組みを用意するだけで、便利機能がカンタンに使えるようになるというわけ。1\

Vimの場合、言語サーバの立ち上げ・言語サーバとのやり取りをやってくれるautozimu/LanguageClient-neovim2をインストールすればよい。

インストールどうすればええのん?

例によってNeoVimのみ動作確認済み。

まず、dein3を使って必要なプラグインをインストール:

[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
rev = 'next'
build = 'bash install.sh'

とかく。

次に、

let g:LanguageClient_serverCommands = {}

" 言語ごとに設定する
if executable('clangd')
    let g:LanguageClient_serverCommands['c'] = ['clangd']
    let g:LanguageClient_serverCommands['cpp'] = ['clangd']
endif

if executable('pyls')
    let g:LanguageClient_serverCommands['python'] = ['pyls']
endif

" 自分の環境では重たくなったのでオフにしておく
let g:LanguageClient_useVirtualText = 0

ここでは、C/C++とPythonの言語サーバであるclangdpylsを設定している。これらが実行できないといけないので、これらもインストールしておく。\

インストールしたらシェルでwhich clangdwhich pylsと実行してみて、パスが通っていることを確認しておこう。4

これで補完の検索候補にclangdpylsの結果が出てくるようになる。

自分の最新の設定はこちらに上げているので参考にしてほしい。

これら以外の言語サーバの開発状況については、提唱元のMicrosoftによる一覧表をご覧頂きたい。同じように言語サーバを事前にインストールし、パスを通してここに書けば使うことができる。

さらなる機能

セマンティックチェック

プログラムのミス(文法ミスだけでなく、関数の引数など割と高度なことも)を自動で指摘してくれる。\

**変数名や文法のちょっとしたミスでコンパイルエラーになるのを防いでくれる。超便利。**個人的にはこれをやるためだけでもLSPを導入する価値があると思う。

以下を追記するのをおすすめする:

augroup LanguageClient_config
    autocmd!
    autocmd User LanguageClientStarted setlocal signcolumn=yes
    autocmd User LanguageClientStopped setlocal signcolumn=auto
augroup END

これは、文法ミスなどがあったときに出てくる記号の場所を常に開けておくようにする設定である。

キーバインド

以下を追記する:

function LC_maps()
    if has_key(g:LanguageClient_serverCommands, &filetype)
        " any keybindings you want, such as ...
        nnoremap <buffer> <silent> K :call LanguageClient#textDocument_hover()<CR>
        nnoremap <silent> <Leader>lh :call LanguageClient_textDocument_hover()<CR>
        nnoremap <silent> <Leader>ld :call LanguageClient_textDocument_definition()<CR>
        nnoremap <silent> <Leader>lr :call LanguageClient_textDocument_rename()<CR>
        nnoremap <silent> <Leader>lf :call LanguageClient_textDocument_formatting()<CR>
    endif
endfunction

autocmd FileType * call LC_maps()

このようにするとLSP対応のファイルの場合のみキーバインドが行われる。\

特に、Kは既存のマップを塗り替えてしまう。こうすることで、Vim Scriptなどを開いているときは通常通りVim標準Docを、LSP対応のファイルを開いているときはそのファイルに対応した説明ファイルを開くということができる。

同じ変数をハイライト

以下を追記する:

augroup LCHighlight
    autocmd!
    autocmd CursorHold,CursorHoldI *.py,*.c,*.cpp call LanguageClient#textDocument_documentHighlight()
augroup END

" カーソル停止から更新までの時間をミリ秒で記入。デフォルトは4秒=4000
set updatetime=50

このようにするとカーソル上の変数・関数・メソッドなどと同じものを自動でハイライトしてくれる。これまた便利。

上にも書いたが、自分の最新の設定を以下に書いてあるので参考にしてほしい。 https://raw.githubusercontent.com/woodyZootopia/nvim/master/plugins/languageclient.vim

以上


  1. ここの説明は、特に前半の図とかが分かりやすかった。 ↩︎

  2. neovim本体にLSPをつける予定もあるようだが、現在のバージョン0.3に対し0.5からなのでまだしばらくはかかりそうである。 ↩︎

  3. deinのインストールなどはこちら ↩︎

  4. Ubuntuでaptをつかってインストールしたところ、clangdの実行ファイルはバージョン名つきのもの(自分だとclangd-7.0)になっていた。そのような場合は、lnupdate-alternativesを使ってパスを通すか、Vim設定ファイルの中のif executable('clangd')のところを適宜変更するなどして対応するといいだろう。また、MacOSでbrew install llvmを使ってインストールした場合、パスを通さないと使えない。export PATH="/usr/local/opt/llvm/bin:$PATH"と実行すればいい。詳しく知りたい人はbrew info llvmで。 ↩︎

Share