Closed11

NeoVimのjob control apiを使ってみる会

JJJJ

上記にあげてたのはremote pluginというものっぽい。自分が考えていたのは完全に疎結合にしてrpcを使って互いのAPIなりfunctionを呼ぶものだった。ので調べ直す

JJJJ

neovimのdocsに書いてあるのを動かしてみる
https://neovim.io/doc/user/eval.html#jobstart()

call jobstart('nvim -h', {'on_stdout': {j,d,e->append(line('.'), d)}})

これを :source で読み直すと

なるほど。
ドッグさんの記事は2014年のものなのでそこから変わってそう。

autocmd JobActivity top-command-*

で受け取ってる部分は、そもそも jobstart した時点でoptionに指定できるっぽい
https://neovim.io/doc/user/eval.html#jobstart-options

なのでドッグさんの書いてるやつを今の書き方で書くとこうなる

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

がはいってくるっぽい
https://neovim.io/doc/user/job_control.html#job

  • 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. Then on_stdout is ignored,
but on_stderr can still be used.

rpcを使うとstdioを介して?(訳し方がわからん)、msgpack-rpcで通信ができるっぽい。ただon_stdoutは使えなくなる(直訳だと無視されるだけどまぁ実質使えなくなる)けど、 on_stderr は使えるのでここに通信自体が失敗したときの処理書いてればよさそう。

JJJJ

https://neovim.io/doc/user/eval.html#rpcnotify()
rpcnotify という関数を使えば特定の場所に特定のmessageを投げれそう。

構文は

rpcnotify({channel}, {event}[, {args}...])

channelはさっきの job_id でよさそう。どのチャンネルにむけて投げるか。これは例えばRustで実装した関数へのpathを ping localhost に指定してる箇所にいれるとその実行ファイルを実行するからそこに対して第二引数のeventを投げれてそれに引数を足すこともできる。

このスクラップは2021/02/10にクローズされました