--- title: "Neovimで記録したマクロを後から編集する" date: '2024-09-10' isPublished: true lang: 'ja' --- > [!NOTE] > この記事は[Vim 駅伝](https://vim-jp.org/ekiden/)の 9/10 の記事です。 # マクロ ~~マクロを使いまくろう!~~ マクロ、使ってますか? Vim / Neovim におけるマクロとは、キー操作を記録して再生する機能です。 その自由度からバッファの編集にとどまらず、ファイル操作やプラグインの操作にも使われます。 # マクロの編集を後からしたい! マクロを記録するには `q` を入力してマクロの記録を開始し、再生するには `@` を入力します。 例えば、`q` でマクロの記録を開始して `a` でマクロ名を指定して `q` で終了します。 そして、`@a` でマクロを再生します(Neovim では `Q` で最後に記録したマクロを再生します)。 ですが、マクロを記録する時って緊張しますよね? 間違って余計な `;` を入力してしまったり、途中で `q` を押し忘れてしまったり。 間違えたらまた最初からやり直し...なんてやってられません! マクロを後から編集できたらいいですよね? # マクロの編集 実は、記録したマクロはレジスタに保存されています。 簡単に確認するには、`:registers` でレジスタの内容を確認できます。 また、`"ap` でレジスタ `a` の内容をペーストして確認できます。 # マクロの編集方法 というわけで、レジスタの中身を編集すればマクロを修正できるわけです。 ではやってみましょう。 手順としては以下の通りです。 1. `getreg` 関数を使ってレジスタの内容を取得する 2. レジスタの内容を編集する 3. `setreg` 関数を使ってレジスタに内容をセットする とてもシンプルですね! # Neovim で lua を使っていい感じにする Neovim には `vim.ui.input` という関数があります。 これを使うとリッチな入力ダイアログを表示できます。 これを使いましょう ```lua vim.keymap.set("n", "(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', 'q', '(macro_edit)', { desc = "Edit a macro", silent = true }) ``` とてもシンプルな実装ですね! これで、`q` に続けてマクロ名を入力すると、そのマクロを編集できるようになります。 (もちろん、これはマクロ編集だけではなく、レジスタの内容の編集機能なので、他の用途にも使えます。ただ自分は主にマクロ編集に使っています) # まとめ 簡単にマクロを編集できるものを作ってみました。 これで、マクロを使いこなすあなたもさらに強くなれるはずです! ぜひ試してみてください!