NeoVimのjob control apiを使ってみる会
NeoVimにはjob control apiというシステムがありNeoVimと他の言語で通信が行える。
サンプルはここに書く。今回はRustとの通信をして簡単な計算式をRust側で実行してそれを表示できるまで
これを参考にしてみる。いったん慣れない言語よりも書き慣れたJSで様子見したい
これが公式のsdkっぽい
上記にあげてたのはremote pluginというものっぽい。自分が考えていたのは完全に疎結合にしてrpcを使って互いのAPIなりfunctionを呼ぶものだった。ので調べ直す
dogさんのこれだな
neovimのdocsに書いてあるのを動かしてみる
call jobstart('nvim -h', {'on_stdout': {j,d,e->append(line('.'), d)}})
これを :source
で読み直すと
なるほど。
ドッグさんの記事は2014年のものなのでそこから変わってそう。
autocmd JobActivity top-command-*
で受け取ってる部分は、そもそも jobstart
した時点でoptionに指定できるっぽい
なのでドッグさんの書いてるやつを今の書き方で書くとこうなる
let g:job_id = jobstart('ping localhost', {'on_stdout': {j,d,e->append(line('$'), 'from server: ' . string(d))}})
job_id
を変数に取ってるのはあとで jobstop
を呼ぶため
結果はこんな感じ
sampleの j,d,e
はvim scriptのラムダの引数だけど、それぞれ
- job_id
- data
- event
がはいってくるっぽい
- job_id はそのまま多分
jobstart
を実行したときのjob_id
がはいってくる - data はstdoutを指定してるならstdoutに吐かれた内容がはいってくる
- eventは stdout/stderr などひっかけたeventがはいってくると思う
optionに rpc
って項目があるのでこれを有効にするといけそうな気配がする。
rpc: (boolean) Use |msgpack-rpc| to communicate with
the job over stdio. Thenon_stdout
is ignored,
buton_stderr
can still be used.
rpcを使うとstdioを介して?(訳し方がわからん)、msgpack-rpcで通信ができるっぽい。ただon_stdoutは使えなくなる(直訳だと無視されるだけどまぁ実質使えなくなる)けど、 on_stderr
は使えるのでここに通信自体が失敗したときの処理書いてればよさそう。
rpcnotify
という関数を使えば特定の場所に特定のmessageを投げれそう。
構文は
rpcnotify({channel}, {event}[, {args}...])
channelはさっきの job_id
でよさそう。どのチャンネルにむけて投げるか。これは例えばRustで実装した関数へのpathを ping localhost
に指定してる箇所にいれるとその実行ファイルを実行するからそこに対して第二引数のeventを投げれてそれに引数を足すこともできる。
Rustに対してrpcを行うサンプルの記事
この部分で echo
を実行してるんだけどそれが帰ってこない...
そもそもここまで届いてるのかみたいなとこからデバッグしたいけど、どうデバッグすればいいかわからん...
すごくしょーもないミスをしてました。。
これでRustと通信できた。