目次
背景
こんにちは。 かりんとうマニア(@karintozuki)です。
皆様、NeoVimのプラグイン開発やってますでしょうか。
私はNeoVimからChatGPTと会話できるプラグインを作っています。
https://github.com/karintomania/nvim-ai-chat
よかったら使ってみてください(宣伝)
今回はそんなプラグイン開発の上で役立つTipsを紹介します。
解決したい課題: os.execute
を使うとUIがブロックされてしまう
NeoVimでターミナルコマンドを実行する際、os.execute
が使えます。
しかし、これには問題があり、UIがコマンド終了までブロックされてしまいます。
以下のサンプルコードを実行すると、NeovimのUIが3秒間操作を受け付けなくなってしまいます。
1 | os.execute("sleep 3") |
これではユーザーが他の操作を行うことができず、使い勝手が悪いです。
今回はこの問題を解決する方法を紹介します。
解決方法: vim.loop.spawn
を使う
NeoVimには非同期処理を行うための便利なモジュールであるvim.loop
があります。
次のサンプルコードを見てください。これを実行すると、UIはブロックされずにsleep
コマンドが実行されます。また、uv.spawn
以降のコードはコマンドの終了を待たずに実行されます。
1 | -- 実行するコマンドの引数。ここでは3秒sleepさせるため、3 |
このように、vim.loop.spawn
を使うことで、UIをブロックせずにコマンドの非同期実行が可能になります。コードの実行結果は、コールバック関数内で処理することができます。
補足
vim.loop.spawn
で実行できるのはターミナルで実行するコマンドだけです。
例えば普通のLua関数を定義して、それをUIブロックせずに呼び出す方法は私は見つけられませんでした。vim.loop
関連の関数で非同期な関数実行を実現できますが、UIはプログラムが終了するまでブロックされてしまいました。もし、良い方法を知っている人がいたらご連絡ください。
vim.loop
の公式ドキュメントがとても学びが深いです。
https://neovim.io/doc/user/lua.html#vim.uv
ドキュメント内ではvim.uv
として紹介されていますが、私の環境(NVIM v0.9.1)ではvim.loop
としないと動きませんでした。
まとめ
今日はvim.loop.spawn
の解説でした。
それじゃ今日はこの辺で。
関連記事
こちらの記事もおすすめです。
PR
あなたの会社はあなたの技術を評価してくれていますか?
技術力を高めようと頑張っているのに、
技術が評価されないような会社にいたらそれは良い環境なのでしょうか?
エンジニアとして技術を高めたいのなら環境を選ぶことも大事です。
レバテックキャリア
エンジニアとして働いていて実務経験があるなら、
求人数の充実具合からレバテックキャリアがおすすめです。
IT転職ではデファクト・スタンダードですね。
▼レバテック キャリア 登録はこちら▼
Tech Clips
Tech Clipsは年収500万以上&自社サービスを持った会社に特化した求人サイトです。
首都圏限定になってはしまいますが、
収入を増やしたい、自社サービスを持った企業への転職をしたい人におすすめです。