🌮

mini.nvimで作る簡易コマンドパレット

2024/03/13に公開


キーマップをfuzzy findできる

以前atusyさんがtelescope.nvimで作っていたものをmini.nvimで作ってみました。
コンセプトはこちらの記事をご覧ください。

https://blog.atusy.net/2022/11/03/telescope-as-command-pallete/

mini.nvimのmini.pickモジュールとmini.extraモジュールを使います。

https://github.com/echasnovski/mini.nvim

require('mini.extra').setup()
require('mini.pick').setup()

キーマップであれば何でもfuzzy findできるのですが、ここでは例として、MiniExtra.pickers以下の関数を呼び出してみます。以下のようにループして<Plug>キーマップに設定します。
元ネタの記事と同じく、descにのようなマーカーをセットしておくとわかりやすいでしょう。

for k, v in pairs(MiniExtra.pickers) do
  if type(v) == "function" then
    local name = 'mini.extra.' .. k
    vim.keymap.set('n', '<Plug>(' .. name .. ')', v, { desc = '☆ ' .. name })
  end
end

なお、これは例のため、すべて無引数で呼び出すようにしています。引数を割り当てたい場合は適宜調整してください。

telescopeのbuiltin.keymaps()に相当するのは、mini.nvimではMiniExtra.pickers.keymaps()です。これに初期値としてを設定すれば、上記で定義したキーマップを絞り込んで表示できます。

ただし、初期queryの設定はちょっと癖があります。
MiniPick.set_picker_query()という関数が用意されているのですが、ピッカー自体が非同期で起動するため、普通に使用しても適切に反映されません。
以下のissueにて書かれていますが、vim.schedule()を介する必要があります。

https://github.com/echasnovski/mini.nvim/issues/513#issuecomment-1762785125

ということで、こうなります。<space>kで起動するようにしてみました。

vim.keymap.set({ 'n' }, '<space>k', function()
  vim.schedule(function() MiniPick.set_picker_query({ '☆ ' }) end)
  MiniExtra.pickers.keymaps({ mode = 'n' })
end, { desc = 'easy command palette' })

これで、<space>kを押下すると、MiniExtra.pickers以下の関数を一覧できます(画像再掲)。


MiniExtra.pickers以下の関数群

たとえばoptと入力して確定すれば…


optを入力して絞り込んだ状態

MiniExtra.pickers.options()が実行され、オプションを確認・切り替えできます。便利。


MiniExtra.pickers.options()の実行中

「たまに使うけど、専用のキーマップを割り当てるほどではない。でもいざ使おうとすると名前や引数を忘れやすい」という関数は、ここに定義しておくと曖昧に呼び出せます。
また、新しく導入した関数をいったんここに入れておいて、使用頻度が高いものは独自キーマップを割り当てるという順番でも良いかもしれません。
簡易的ではあるもののなかなか汎用性が高いと思います。興味を持った方は試してみてください。

Discussion