ElmCast/elm-vimをやめてvim-lspとasyncompleteを使ってelm-language-serverに対応したVim環境を整えたのでメモ。
プラグイン導入
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の設定を手で書くのがいいだろう。
なお、Vimは8.2 patch 929からビルトインでElmのシンタクスハイライト設定を内蔵しているため、もはやElmをVimで書くのにシンタクス用プラグインも導入しなくてよい。
設定
自分は基本的に各プロジェクトの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がグローバルインストールされている場合にはそちらが優先されるのかも知れないが、自分は試していない。