2019年2月12日火曜日

vim-lsp と eclipse.jdt.ls で Java プログラミング環境を構築する

下記ツイートを見たので、試してみた。

前提

  • OS: Windows 10 Pro
  • Vim: 8.1 patch 573
  • vim のパッケージ管理は vim8 のパッケージ機能 & git submodule を使っている

eclipse.jdt.ls のダウンロードと配置

次のサイトから jdt-language-server-0.32.0-201901231649.tar.gz をダウンロードする。

今回は、 ~/eclipse.jdt.ls/ に配置するので、ディレクトリ ~/eclipse.jdt.ls/ を作って、 tar.gz を展開してできたものを格納する。 格納するファイル(ディレクトリ)は次の 5 つ。

  • config_linux
  • config_mac
  • config_win
  • features
  • plugins

必要プラグインの導入

git submodule で管理しているので、必要な vim プラグインを git リポジトリに登録する。 登録するプラグインは次の 2 つ。

cd /PATH/TO/dotvim
git submodule add https://github.com/prabirshrestha/async.vim ./.vim/pack/lsp/opt/async.vim
git submodule add https://github.com/prabirshrestha/vim-lsp ./.vim/pack/lsp/opt/vim-lsp

async.vimvim-lsp 用でしか使わない予定なので pack/lsp 内に入れてしまう。

vimrc へ vim-lsp の設定を追加

vim-lsp の READMEeclipse.jdt.ls の README を見ながら .vimrc へ追記。

""" for java development
command! Javad call StartJavaDevelopment()
function! StartJavaDevelopment()
    packadd async.vim
    packadd vim-lsp

    " ログ表示の設定
    let g:lsp_log_verbose = 0
    "let g:lsp_log_file = expand('~/vim-lsp.log')
    "let g:asyncomplete_log_file = expand('~/asyncomplete.log')

    autocmd User lsp_setup call lsp#register_server({
        \ 'name': 'eclipse.jdt.ls',
        \ 'cmd': {server_info->[
        \     'c:\java\jdk1.8.0_201\bin\java',
        \     '-Declipse.application=org.eclipse.jdt.ls.core.id1',
        \     '-Dosgi.bundles.defaultStartLevel=4',
        \     '-Declipse.product=org.eclipse.jdt.ls.core.product',
        \     '-Dlog.level=ALL',
        \     '-noverify',
        \     '-Dfile.encoding=UTF-8',
        \     '-Xmx1G',
        \     '-jar',
        \     fnamemodify("~", ":p") . '/eclipse.jdt.ls/plugins/org.eclipse.equinox.launcher_1.5.200.v20180922-1751.jar',
        \     '-configuration',
        \     fnamemodify("~", ":p") . '/eclipse.jdt.ls/config_win',
        \     '-data',
        \     fnamemodify("~", ":p") . '/eclipse.jdt.ls/workspace'
        \ ]},
        \ 'root_uri':{server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), 'build.gradle'))},
        \ 'whitelist': ['java'],
        \ })

    call lsp#enable()
    autocmd FileType java setlocal omnifunc=lsp#complete
endfunction

「いつでも有効」にはしたくないので、 Javad コマンドを実行したときに packadd して必要な定義を行うようにした。

lsp#register_server の値

  • name: サーバ名
    • サーバが判別できる任意の名前
  • cmd: LSP 起動コマンド
    • bat ファイル作ってそれを呼び出すようにしたほうがスマートっぽい
  • root_uri: プロジェクトルートの場所
    • ここでは vim-lsp のユーティリティを使って、 build.gradle 探すようにしている
  • whitelist: この LSP サーバを使う FileType

これで、 eclipse.jdt.ls の補完結果が、 vim のオムニ補完に表示されるようになる。

補完系プラグインを使っているならば、そのヘルプに補完結果指定方法が書かれているはず。

以上。

参考資料

0 件のコメント:

コメントを投稿