Vimの補完プラグインをインストール。その2

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

最初は'cmd' に 'deno', 'run', ... などと試してましたが、シェルスクリプトを作成するのが一番シンプルだなと思いまして。

これでvimrcを開いて :CheckHealth すると、

lsp: health#lsp#check
=====================
## server status
  - WARNING: pylsp: not running
  - OK: vimls: running

## server configuration: pylsp
  - INFO:
    ### allowlist
    ['python']

## server configuration: vimls
  - INFO:
    ### allowlist
    ['vim']

と表示するようになりました。

そのうちRuffも入れてみようと思います。Ruffはpacmanからインストールできて、python-lsp-serverにプラグインとして組み込めるようなので、BlackやFlake8と同等の設定ができればいいなと考えています。

あと、Vimのmessages、cmdline、popupmenuを置き換えるNoiceというのもあるようで、これはおいおい試してみます。

0 件のコメント:

コメントを投稿

Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3 で、 ddc-tabnine が使えそうです、などと書いたのですが、早速やってみました。 まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、 tabnine-nvim にあるダ...