Vimでpython-language-serverが動くようになりましたが、もう一つの本題が、いまいじってるvimrcをサポートしてくれるvim-language-server。これがnpmモジュールなんですね、実は。だって自分はTypeScript使わないから、npmもインストールしたくないし。なので、すでにDenoをインストールしているので、このvim-language-server(長いからvimlsにします)をDenoで使えないか、というあたりを攻めてみます。
Dinoは1.25以降でnpmモジュールをサポートするようになったということで、ちょっとこちらの解説を見ても今ひとつピンとこないのですが、要するにimport文やrunコマンドでnpmモジュールを指定することで、npm install相当のことをやってくれて実行できる、ということのようです。
$ pacman -Qs deno
local/deno 1.46.2-1
A secure runtime for JavaScript and TypeScript
$ deno run npm:vim-language-server --help
✅ Granted env access to "XDG_RUNTIME_DIR".
✅ Granted sys access to "cpus".
error: Uncaught Error: Connection input stream is not set. Use arguments of createConnection or set command line parameters: '--node-ipc', '--stdio' or '--socket={number}'
(スタックトレースは省略)
$ deno run npm:vim-language-server --stdio
✅ Granted env access to "XDG_RUNTIME_DIR".
✅ Granted sys access to "cpus".
実際にはvimlsの他にstreamモジュールも必要だったので、コマンドラインからインストールしています。
$ deno
Deno 1.46.3
exit using ctrl+d, ctrl+c, or close()
REPL is running with all permissions allowed.
To specify permissions, run `deno repl` with allow flags.
> import "npm:stream"
[Module: null prototype] {
default: <ref *1> [Function: Stream] { Stream: [Circular *1] }
}
>
importするだけでインストールしてくれるので、楽ちん。もっとも、pacmanを使わないので、アップデートはどうするんだろうとかありますが。"npm:stream@0.0.3"とかするとバージョン指定できるので、それでやるのかな。ちなみにnpmモジュールは${XDG_CACHE_HOME}/deno/npm/registry.npmjs.org/の下にダウンロードされるようです。ついでに言えば、globalインストールする方法は調べてません。
それでは、vimlsをDenoで起動してみます。
$ deno run npm:vim-language-server
┏ ⚠️ Deno requests env access to "XDG_RUNTIME_DIR".
┠─ Learn more at: https://docs.deno.com/go/--allow-env
┠─ Run again with --allow-env to bypass this prompt.
┗ Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all env permissions) >
なんか許可するかどうするか聞いてきました。
Denoはセキュリティ強化の観点で、環境変数やファイルへのアクセス許可、実行許可などなど、いろいろ聞いてきます。vimlsは裏で起動してくれないと困るので、プロンプトを出さないようにするためにはオプション指定が必要です。-A を指定すると、全部まとめて許可!とかやってくれるみたいですが、推奨は個別指定なので、以下のようにしました。
$ deno run --allow-sys --allow-env --allow-read --allow-run npm:vim-language-server --stdio
--allow-readと--allow-runはvim-lspから起動されるときに必要になります。またvimlsは通信方法を指定しなくてはいけないので、--stdioを指定しています。上記のコマンドで起動すると、標準入力からの入力待ちになります。ということで起動まではOK。
vimlsの起動方法がわかったので、vimrcに設定していきます。
その1ではPythonの設定をしたのでそこから始めますが、それに先立って Neovim のCheckHealthと同等のチェックをしてくれるvim-healthcheckをインストールしておきます。language serversの状態も表示してくれるので、動いているかどうかの確認は簡単にできます。
call dein#add('rhysd/vim-healthcheck')
次に、vim-lspからlsp#regster_serverに食わせるために起動コマンドを記述するのですが、どうもnpmでvimlsをインストールした場合には vim-language-server というシンボリックリンクを作成してそれを起動しているみたいです。今回はDenoから起動する必要があるので、~/binにvim-language-serverというシェルスクリプトを作成して、それを起動することにします。
$ cat ~/bin/vim-language-server
#!/bin/sh
deno run --allow-sys --allow-env --allow-read --allow-run npm:vim-language-server --stdio
当然PATHも通しておきます。
そしてvimrcはこんな感じ。
if (executable('vim-language-server'))
augroup LspVim
autocmd!
autocmd User lsp_setup call lsp#register_server({
\ 'name': 'vimls',
\ 'cmd': {server_info->['vim-language-server']},
\ 'allowlist': ['vim'],
\ 'initialization_options': {
\ 'vimruntime': $VIMRUNTIME,
\ 'runtimepath': &rtp,
\ 'diagnostic': {'enable': v:true}
\ }})
augroup END
endif
あと、Vimのmessages、cmdline、popupmenuを置き換えるNoiceというのもあるようで、これはおいおい試してみます。