メインコンテンツへスキップ
  1. ノート/
  2. Vim / Neovim/

Neovim macro

·1504 文字·4 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml
この記事は中国語版をもとにした日本語版です。技術用語は、初出では English term(日本語の専門用語)という形で表記します。コマンド、コード、数式、画像、リンク、記事の構成は原文に合わせています。

Neovim の macro programming(マクロプログラミング)は、操作を記録して macro(マクロ)として再生し、繰り返し操作をすばやく実行する機能です。Vim/Neovim で特に実用性が高く、編集効率を大きく上げられます。


✅ Neovim のマクロとは?
#

マクロの本質は、Normal mode(ノーマルモード)で行った一連の操作を記録し、再生することです。

マクロを使うと、次のことができます。

  • 一連の操作を記録する
  • 特定の register(レジスタ、たとえば a)に保存する
  • @a で繰り返し実行する
  • @@ で直前に実行したマクロをもう一度実行する

📌 マクロの基本操作
#

操作コマンド
マクロの記録を開始q<register>。たとえば qa でレジスタ a に記録する
操作を実行通常どおりコマンドを入力する(dwjiHello<Esc> など)
記録を停止q
マクロを実行@a でレジスタ a のマクロを実行する
直前のマクロを繰り返す@@

🛠 例: 各行の最初の単語を削除する
#

  1. qa → レジスタ a への記録を開始する。
  2. ^dwj → 行頭 (^) へ移動し、単語を削除 (dw) して次の行 (j) へ移動する。
  3. q → 記録を終了する。
  4. @a → マクロを 1 回実行する。
  5. @@ → 直前のマクロをもう一度実行する。
  6. 10@a → マクロを 10 回実行することもできます。

📎 コツと注意点
#

  • マクロには Normal/Insert/Visual mode(ノーマル・インサート・ビジュアルモード)の操作を記録できますが、Lua や Vimscript のコードを直接記録するものではありません。
  • マクロの動作は、現在のカーソル位置、レジスタの内容、エディターの状態に左右されます。実行前に状態をそろえておくと安全です。
  • Insert mode(インサートモード)で入力した内容もマクロに記録されます。
  • 移動には、手動で左右へ移動する lh より、0$^ のような固定的な操作を使うことをおすすめします。カーソル位置の違いによる動作のずれを防げます。

🚀 さらに活用する
#

  • :normal を使うと、複数行にマクロを一括適用できます。

    :10,20 normal @a
  • Lua からマクロを呼び出したり、vim.api.nvim_feedkeys などを使って、より高度な一括処理を実装したりできます。


#

test1 1.txt
test2 2.txt
test3 3.txt
...
test10 10.txt

ここでは Neovim のマクロ(@a など)でこれらの行を自動生成する方法を、二つのケースに分けて説明します。


✅ ケース 1: 最初の test1 1.txt だけがあり、続きの行を生成したい場合
#

この場合は、マクロと Ctrl-a(数値を 1 増やすコマンド)を組み合わせて、各行を自動生成できます。

🪄 操作手順
#

  1. 最初の行を手動で入力します。

    test1 1.txt
  2. カーソルを行頭へ移動し、次を実行します。

    qa             " レジスタ a への記録を開始
    yyp            " 行全体をコピーして貼り付け
    w<C-a>         " 数字 1 へ移動して 1 増やす(2 になる)
    w<C-a>         " 1.txt の 1 へ移動して 1 増やす(2.txt になる)
    q              " 記録を停止
  3. その後、次を実行します。

    @a             " マクロを 1 回実行
    @@             " 直前のマクロを繰り返す(複数回実行可能)

9 回まとめて実行し、9 行追加することもできます。

9@a

👀 実行結果
#

test1 1.txt
test2 2.txt
test3 3.txt
test4 4.txt
...
test10 10.txt

💡 補足説明
#

  • yyp: 行全体をコピーして貼り付ける。

  • w<C-a>: 最初の数字 (1) へ移動し、Ctrl-a で 1 増やす。

  • もう一度 w<C-a>: 次の数字、つまり 1.txt 内の 1 へ移動して 1 増やす。

  • 形式が 英単語 + 空白 + 数字.txt であれば、このマクロで数字を自動的に進められます。


たとえば、次のように形式が複雑になった場合:

prefix-test01 result_001.txt

このように先頭に 0 が付く形式では、g<C-a>(より高度な Vim のインクリメントコマンド)や Lua を使って一括生成できます。


 nvim command LazyVim plugins 

评论