job_start()
system() と job_start() と :term ++hidden の使い分けにも書いてあるとおり、
job_start() はコマンド実行後、すぐに戻りたいときに使う
code:vim
job_start({command} {options})
param
command:実行するコマンド
options:
return
開始したジョブのジョブオブジェクトを返す
command
文字列 or リスト
文字列
Windows の場合
文字列のほうがいい
Unix の場合
execvp() に渡され、空白で分割される
"で囲んだ引数には空白を含めることができる
job_start('echo "hello world"')みたいな?
リスト
Unix での実行に適している
1つ目の要素はコマンド、それ以外は引数となる
説明
ジョブの終了は待たない
端末ウィンドウでジョブを開始する場合、term_start() を使う
GUIアプリを表示させたい場合、:!startを使う
ジョブの起動に失敗した場合
返されたジョブオブジェクトの job_status() は "fail" となる
コールバック関数は呼び出されない
Windows で job_start() を使うと、GUIアプリケーションは隠れてしまう
→ GUIアプリを表示させたい場合、:!startを使う必要がある
code:vim
:let chrome_job = job_start('chrome.exe') " 何も表示されない(失敗したのかも?)
:!start chrome.exe " Chromeが表示された
ステータスの確認:job_status()
ジョブの停止:job_stop()
ジョブオブジェクトの扱いについて
ジョブオブジェクトは参照されない場合、削除される
stdin と stdout を閉じて、エラーによってジョブの失敗になることがある → なんで!?
ジョブを実行するときは
code:vim
:call job_start('my_job_cmd')
ではなく
code:vim
:let my_job = job_start('my_job_cmd')
とし、ジョブが必要なくなったら、:unlet my_jobする
また、関数ローカルなジョブオブジェクトを作成してしまうと、関数を抜けたあとにそのジョブオブジェクトは削除されてしまうため、失敗してしまうかもしれない
s: か g: がいいかも?
options
Dictionaryを渡す
関連
system()
:!cmd
:!start
term_start()