vim.defer_fn でコマンドを直列実行する

2023/06/16に公開

はじめに

2023年6月現在、私はファイラーにoil.nvimを、バッファ内のあいまい検索にfuzzy-motion.vimを使っています。
そこで、ファイラーを開いた直後にあいまい検索ができたら便利じゃないのか?という疑問を抱き、このようなキーマップを定義しました。

vim.keymap.set("n", "<leader>e",
function ()
  vim.cmd"Oil ."
  vim.schedule(function()
    vim.cmd.FuzzyMotion()
  end)
end,
{ noremap=true, silent=true })


しかし、結果はファイラーが起動する前にあいまい検索が起動してしまい使いものになりませんでした。
vim-jpでそのことを呟くと、vim.defer_fn()で実現できますよとryoppippiさんに教えていただきました。ありがとうございます!

ドキュメントを確認したところ、第2引数へ時間を設定できるため起動タイミングをずらすことができるということでした。
そのため、vim.defer_fn()を使って書き換えたところ、

vim.keymap.set("n", "<leader>e",
function ()
  vim.cmd"Oil ."
  vim.defer_fn(function()
    vim.cmd.FuzzyMotion()
  end, 150)
end,
{ noremap=true, silent=true })


思ったとおりに動作しました。

おわりに

vim.schedule()で直列実行がうまくいかない場合はvim.defer_fn()を使ってみてね。

Discussion