Neovimで記録したマクロを後から編集する
マクロ
マクロを使いまくろう!
マクロ、使ってますか?
Vim / Neovim におけるマクロとは、キー操作を記録して再生する機能です。
その自由度からバッファの編集にとどまらず、ファイル操作やプラグインの操作にも使われます。
マクロの編集を後からしたい!
マクロを記録するには q
を入力してマクロの記録を開始し、再生するには @
を入力します。
例えば、q
でマクロの記録を開始して a
でマクロ名を指定して q
で終了します。
そして、@a
でマクロを再生します(Neovim では Q
で最後に記録したマクロを再生します)。
ですが、マクロを記録する時って緊張しますよね?
間違って余計な ;
を入力してしまったり、途中で q
を押し忘れてしまったり。
間違えたらまた最初からやり直し...なんてやってられません!
マクロを後から編集できたらいいですよね?
マクロの編集
実は、記録したマクロはレジスタに保存されています。
簡単に確認するには、:registers
でレジスタの内容を確認できます。
また、"ap
でレジスタ a
の内容をペーストして確認できます。
マクロの編集方法
というわけで、レジスタの中身を編集すればマクロを修正できるわけです。
ではやってみましょう。
手順としては以下の通りです。
-
getreg
関数を使ってレジスタの内容を取得する - レジスタの内容を編集する
-
setreg
関数を使ってレジスタに内容をセットする
とてもシンプルですね!
Neovim で lua を使っていい感じにする
Neovim には vim.ui.input
という関数があります。
これを使うとリッチな入力ダイアログを表示できます。
これを使いましょう
vim.keymap.set("n", "<Plug>(macro_edit)", function()
local reg = string.char(vim.fn.getchar())
local reg_content = vim.fn.getreg(reg)
if reg_content == "" then
vim.notify(string.format("Macro '%s' is empty", reg))
return
end
vim.ui.input({
prompt = "Edit a macro",
default = reg_content,
}, function(i)
if i == nil or i == "" then
vim.notify(string.format("Edit a macro '%s' canceled", reg))
return
end
vim.fn.setreg(reg, i)
end)
end)
vim.keymap.set('n', '<leader>q', '<Plug>(macro_edit)', { desc = "Edit a macro", silent = true })
とてもシンプルな実装ですね!
これで、<leader>q
に続けてマクロ名を入力すると、そのマクロを編集できるようになります。
(もちろん、これはマクロ編集だけではなく、レジスタの内容の編集機能なので、他の用途にも使えます。ただ自分は主にマクロ編集に使っています)
まとめ
簡単にマクロを編集できるものを作ってみました。
これで、マクロを使いこなすあなたもさらに強くなれるはずです!
ぜひ試してみてください!
Discussion