@ryoppippi

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

10 Sept 2024 ・ 4 min read


Note

この​記事はVim 駅伝の​ 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 と​いう​関数が​あります。 これを​使うと​リッチな​入力ダイアログを​表示できます。

これを​使いましょう

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 に​続けて​マクロ名を​入力すると、​その​マクロを​編集できるようになります。

(もちろん、​これは​マクロ編集だけではなく、​レジスタの​内容の​編集機能なので、​他の​用途にも​使えます。​ただ​自分は​主に​マクロ編集に​使っています)

まとめ

簡単に​マクロを​編集できる​ものを​作ってみました。 これで、​マクロを​使いこなすあなたも​さらに​強くなれるはずです! ぜ​ひ試してみてください!

comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi