Julia の Language server を Vim でうごかす

やっと、 LanguageServer.jl を動かせるようになったのでまとめます。将来はもっと簡単になると思いますが、とりあえず。

Julia 側の準備

まずなんですが、現在 (2019/2/9) の時点では [LanguageServer.jl] は Julia v1.1.0 では正常に動作しないようです。なので、別に v1.0.3 をインストールします。この時、パスを通す必要はありません。

次に LanguageServer.jlSymbolServer.jl をインストールします。Julia v1.0.3 を起動し ]add LanguageServer SymbolServer と実行します。SymbolServerLanguageServer の依存に入っているはずなんですけど、なぜか後で手動読み込みする必要があるので、明示的にインストールします。今のところ LanguageServer は v"0.5.1" 、SymbolServer は v"0.1.2" で動作確認しています。

※ --- 2019/4/4 追記 ---

SymbolServer.jl が v"0.1.3" に更新され、julia 1.1.0 でも動作するようになりました🎉

※ --- 2019/4/4 追記ここまで ---

f:id:machakann:20190209152230p:plain

LanguageServer の起動スクリプト startlanguageserver.jl を保存しておきます。このファイルパスをのちに vimrc に書く必要があります。

  • startlanguageserver.jl
import LanguageServer
import Pkg
import SymbolServer

envpath = dirname(Pkg.Types.Context().env.project_file)

const DEPOT_DIR_NAME = ".julia"
depotpath = if Sys.iswindows()
    joinpath(ENV["USERPROFILE"], DEPOT_DIR_NAME)
else
    joinpath(ENV["HOME"], DEPOT_DIR_NAME)
end

server = LanguageServer.LanguageServerInstance(stdin, stdout, false, envpath, depotpath, Dict())
server.runlinter = true
run(server)

これで Julia 側の準備は終わりです。試しに include("path/to/startlanguageserver.jl") を実行してエラーが出ないか確かめましょう。

f:id:machakann:20190209152928p:plain

Vim 側の準備

vim-lsp と必要なプラグインをインストールします。

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'

vim-lsp の README から引用しました。vim-plug を使った例のようですね。好きなプラグインマネージャを使うように読み替えましょう。自動補完が必要なら追加でいくつか必要です。

Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'prabirshrestha/asyncomplete-lsp.vim'

最後に次の設定を vimrc に追加します。実行ファイルと起動スクリプトのパスを指定する必要があります。(s:julia_exe 及び s:julia_lsp_startscript)

let s:julia_exe = 'path/to/julia-1.0.3-executable'
let s:julia_lsp_startscript = 'path/to/startlanguageserver.jl'
if executable('julia')
  autocmd User lsp_setup call lsp#register_server({
  \ 'name': 'julia',
  \ 'cmd': {server_info->[s:julia_exe, '--startup-file=no', '--history-file=no', s:julia_lsp_startscript]},
  \ 'whitelist': ['julia'],
  \ })
endif

以上で終わりです。

使用に関して

*.jl なファイルを開くと起動します。起動に少し時間がかかるようなので気長に待ちましょう。わたしのノートPCだと20秒ぐらいかかります。補完はさらにインサートモードに入って何文字かタイプした後、7~8 秒待って次にインサートモードに入るときにはじまるようです。

全部の機能が動いているかはまだ試していません。SymbolServer は結局動いているか微妙な感じもします。

f:id:machakann:20190209155720g:plain

※ 2018/2/10 追記 : リネーム機能は動いてない模様。あとでもうちょっと調べます。vscode だと動くんだけどな…