読者です 読者をやめる 読者になる 読者になる

Re: quickrunで即座に終了しないプログラムを動かしてもフリーズしない方法

vim

thincaさんへの質問をまとめるとこんな感じです。暇な時に返事ください。

  • 「50ミリ秒以内に〜」の記述の意図がわからない
  • :help quickrun-option-runmode のasync:vimprocとasync:remote:vimprocの違いが知りたい
quickrunで即座に終了しないプログラムを動かしてもフリーズしない方法 - Humanity

全然暇じゃないけど返事します。

「50ミリ秒以内に〜」の記述の意図がわからない

async:vimproc は非同期でコマンドを実行するものだが、50ミリ秒以内に終わった場合は非同期実行を行わない。つまりこの場合 'updatetime' に依存せずにすぐに結果が出る。

:help quickrun-option-runmode のasync:vimprocとasync:remote:vimprocの違いが知りたい

async:vimproc は vimproc でコマンドを実行する。
async:remote:vimproc は結果を remote で返すためのプロセスを vimproc で実行する。

まず、vimproc は外部プロセスを起動するだけなので完了したかどうかはこちらから確認する必要がある。よって、CursorHold などを使って polling している。
一方、remote を使うと結果をダイレクトに現在の Vim に送れるので vimproc と違って polling する必要がない。結果が出た直後に表示できる。
ついでに async:remote と async:remote:vimproc の違いは、vimproc なしだと外部プロセスを投げっぱなしで実行するので Vim から終了する手段がない。
一方 vimproc を使えば kill することが可能になる。が、一応新しい :QuickRun を実行する際に前回の実行が残ってたら殺しているつもりなんだけど、うまくいっていないかもしれないし*1、いってたとしてもそれ以外に殺す方法がまだ用意されていない。ここは要改善。

最後に

help にも書いてある通り、

NOTE: "simple" 以外は不安定な場合があります。

いろいろとまだ実装が怪しい部分があるので使う場合は自己責任でお願いします。

*1:実際 SEGV するらしいし