🤖

Neovimで記録したマクロを後から編集する

2024/09/11に公開

マクロ

マクロを使いまくろう!

マクロ、使ってますか?

Vim / Neovim におけるマクロとは、キー操作を記録して再生する機能です。
その自由度からバッファの編集にとどまらず、ファイル操作やプラグインの操作にも使われます。

マクロの編集を後からしたい!

マクロを記録するには q を入力してマクロの記録を開始し、再生するには @ を入力します。
例えば、q でマクロの記録を開始して a でマクロ名を指定して q で終了します。
そして、@a でマクロを再生します(Neovim では Q で最後に記録したマクロを再生します)。

ですが、マクロを記録する時って緊張しますよね?
間違って余計な ; を入力してしまったり、途中で q を押し忘れてしまったり。
間違えたらまた最初からやり直し...なんてやってられません!

マクロを後から編集できたらいいですよね?

マクロの編集

実は、記録したマクロはレジスタに保存されています。
簡単に確認するには、:registers でレジスタの内容を確認できます。
また、"ap でレジスタ a の内容をペーストして確認できます。

マクロの編集方法

というわけで、レジスタの中身を編集すればマクロを修正できるわけです。
ではやってみましょう。

手順としては以下の通りです。

  1. getreg 関数を使ってレジスタの内容を取得する
  2. レジスタの内容を編集する
  3. 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