mini.nvimで作る簡易コマンドパレット
キーマップをfuzzy findできる
以前atusyさんがtelescope.nvimで作っていたものをmini.nvimで作ってみました。
コンセプトはこちらの記事をご覧ください。
mini.nvimのmini.pickモジュールとmini.extraモジュールを使います。
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()
を介する必要があります。
ということで、こうなります。<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