Runner in the High

技術のことをかくこころみ

vim-lspでElm用のVim環境を構築する

ElmCast/elm-vimをやめてvim-lspとasyncompleteを使ってelm-language-serverに対応したVim環境を整えたのでメモ。

github.com

プラグイン導入

vim-plugでvim-lspとasyncomplete系のプラグインを一気に導入する。すでに導入していれば不要。

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'https://github.com/IzumiSy/vim-lsp-settings'

最後のvim-lsp-settingsは正しくはmattnさん作のプラグインで、vim-lsp用の設定を自動で適用してくれかつ各言語用のサーバーがなければインストールを実行してくれる超便利なプラグイン。これは絶対あったほうがいい。

しかし、この記事を書いた時点ではelm-language-server用の設定にバグがあり正しくサーバーが起動されなかったため、一旦自分で修正してフォークしたものを使っている。

PRは出しているので、VimでElmの環境を整えたい人は以下のPRがマージされるまでは自分のやつを使ってもらうか、自分でvim-lsp用のelm-language-serverの設定を手で書くのがいいだろう。

github.com

なお、Vimは8.2 patch 929からビルトインでElmのシンタクスハイライト設定を内蔵しているため、もはやElmをVimで書くのにシンタクス用プラグインも導入しなくてよい。

github.com

設定

自分は基本的に各プロジェクトのdevDependenciesにElm関連のバイナリをインストールするのでelm-language-serverの設定としてバイナリのパス設定を追加する。

let g:lsp_settings = {
\   'elm-language-server': {
\     'initialization_options': {
\       'elmPath': './node_modules/.bin/elm',
\       'elmFormatPath': './node_modules/.bin/elm-format',
\       'elmTestPath': './node_modules/.bin/elm-test'
\     }
\   }
\ }

ファイル保存時のフォーマッター実行も追加。

au BufWritePre *.elm :LspDocumentFormat

あとカーソルがある部分の関数やレコード定義を左右分割か別タブで表示する設定も入れている。

nnoremap <leader>df :vert LspDefinition<CR>
nnoremap <leader>tt :tab LspDefinition<CR>

以上、これだけでVimでも補完を効かせてElmが書ける。定義元へも飛べる。

vim-lspの設定はかなり面倒だと思い込んでいたが、実際にはvim-lsp-settingsを入れておけば勝手に言語サーバーのインストールから設定までやってくれるので、ほとんどIDEと体験は変わらなかった。

あとはElmファイルをVimで開くと「elm-language-serverをインストールするか」というような旨のメッセージが出るので、それに従ってインストールさせればよい。elm-language-serverがグローバルインストールされている場合にはそちらが優先されるのかも知れないが、自分は試していない。