elm-tooling/elm-language-server: Language server implementation for Elm の実装が進んできて、定義へのジャンプやhoverなどが可能になった。
普段はvim使ってるけどelm書くときだけはatomなんだよな。。という人の参考になればいいなと思う。
今回はセットアップ方法中心に書いていく。
環境
$ node -v
v11.12.0$ npm --version
6.7.0$ elm --version
0.19.0
$ elm-format --help
elm-format 0.8.1
$ elm-test --version
0.19.0-rev6$ vim -v
NVIM v0.4.0-dev
セットアップ
syntax
neovim/vim ともに執筆現在はelmのためのsyntaxはdefaultでは入っていない
syntaxのpluginを入れて、気持ちよく開発したい。
ElmCast/elm-vim: Elm plugin for Vim
このpluginを利用してelmのsyntaxを有効にする
vim-plugを用いたplugin installの例は以下
Plug 'ElmCast/elm-vim', { 'for': 'elm' }

だいぶ見やすくなった。sytaxを有効にしたいだけだからdefaultのkeybindingは無効にしておく。
let g:elm_setup_keybindings = 0
Lsp Server
elm-tooling/elm-language-server: Language server implementation for Elm
$ git clone https://github.com/elm-tooling/elm-language-server.git
$ cd elm-language-server
$ git rev-parse HEAD
78aca21bd308bfc33540ef0c90b275ea4aaa4eb1
$ npm install
$ npm run compile
$ npm link$ source ~/.zshrc
$ which elm-language-server
/Users/cappyzawa/.anyenv/envs/nodenv/shims/elm-language-server
elm-language-server
コマンドにPATHが通っていればOK
Lsp Client
vimで利用できるLsp Clientは以下のようなものがある
- neoclide/coc.nvim: Intellisense engine for vim8 & neovim, full language server protocol support as VSCode
- prabirshrestha/vim-lsp: async language server protocol plugin for vim and neovim
- autozimu/LanguageClient-neovim: Language Server Protocol (LSP) support for vim and neovim.
結局はelmのfileを編集するときに elm-language-server --stdio
コマンドが実行されていればいいからお好きなものを選べばいい。
coc.nvimの設定はelm-tooling/elm-language-server: Language server implementation for Elm に書いている通りなので、今回はvim-lspで設定してみる(普段はcoc.nvimなんだが。。)
またREADMEにはw0rp/aleを使う例もあるが、lint/formatは上記のlsp-clientだけでも解決できる。(つまりantew/vim-elm-language-server はいれなくても大丈夫)
以下を追加
if executable('elm-language-server')
au User lsp_setup call lsp#register_server({
\ 'name': 'elm-language-server',
\ 'cmd': {server_info->[&shell, &shellcmdflag, 'elm-language-server --stdio']},
\ 'initialization_options': {
\ 'runtime': 'node',
\ 'elmPath': 'elm',
\ 'elmFormatPath': 'elm-format',
\ 'elmTestPath': 'elm-test',
\ 'rootPatterns': 'elm.json'
\ },
\ 'whitelist': ['elm'],
\ })
autocmd BufWritePre *.elm LspDocumentFormat
endif
autocmd BufWritePre
を設定していることにより、ファイル書き込み前にelm-format
がかかるようにしている。
あとはelmのファイルを開いてlsp-clientのコマンドを叩いて使用感を確かめれば良い。
利用可能なコマンド: prabirshrestha/vim-lsp#SupportedCommands
付録
language-serverのsupport actionの一覧 => Langserver.org
vim x LSPをもっと知りたい => LSPがもたらしたVimプラグインの変化に思いを馳せる — Speaker Deck
elm-language-serverの動向を知りたい => #elm-language-server — Slack
Elm-jp => Elm-jp
追記
普段は以下のようにしてpluginの住み分けをしている
- lint/format:ale/ale.vim at master · w0rp/ale
- 定義jumpなど: neoclide/coc.nvim: Intellisense engine for vim8 & neovim, full language server protocol support as VSCode
ソースは dotfiles/.vim at master · cappyzawa/dotfiles だが、それぞれに関するところを抜粋してコピペすれば(たぶん)それなりに使えるコードを貼っておく
pluginのinstall
Plug 'neoclide/coc.nvim', {'do': { -> coc#util#install()}}
Plug 'w0rp/ale'
Plug 'ElmCast/elm-vim', { 'for': 'elm' }
各種設定
" elm-vim
let g:elm_format_autosave = 0
let g:elm_setup_keybinding = 0
let g:elm_jump_to_error = 0" ale
let g:ale_fix_on_save = 1
let g:ale_set_quickfix = 1
let g:ale_sign_error = '🔥'
let g:ale_sign_warning = '⚡️'
let g:ale_echo_msg_error_str = '🔥'
let g:ale_echo_msg_warning_str = '⚡️'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
let g:ale_fixers = {
\ 'elm': ['elm-format'],
\}
let g:ale_elm_format_executable = 'elm-format'
let g:ale_elm_format_options = '--yes --elm-version=0.19'" coc.nvim
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
nmap <silent> gt <Plug>(coc-rename)
nnoremap <silent> gk :call <SID>show_documentation()<CR>function! s:show_documentation()
if &filetype ==# 'vim'
execute 'h '.expand('<cword>')
else
if coc#util#has_float()
pc
else
call CocActionAsync('doHover')
endif
endif
endfunction
:CocConfig
{
"suggest.triggerAfterInsertEnter": true,
"suggest.noselect": false,
"suggest.minTriggerInputLength": 2,
"suggest.acceptSuggestionOnCommitCharacter": true,
"suggest.snippetIndicator": " ►",
"suggest.enablePreview": true,
"coc.preferences.hoverTarget": "float",
"coc.preferences.diagnostic.displayByAle": true,
"list.autoResize": true,
"languageserver": {
"elmLS": {
"command": "elm-language-server",
"args": [
"--stdio"
],
"filetypes": [
"elm"
],
"rootPatterns": [
"elm.json"
],
"initializationOptions": {
"runtime": "node",
"elmPath": "elm",
"elmFormatPath": "elm-format"
}
}
}
}
2019/06/22
antew/vim-elm-language-server merged into w0rp/ale · Issue #1 · cappyzawa/medium
いろいろ情報をもらったのでここに加筆していこうと思う。
elm-language-server
のinstallが簡単にできるようになった。
$ npm i -g @elm-tooling/elm-language-server
elm-toolingでvimでelmかくにはこれ入れた方がいいよってやつがでた