Vim操作方法

[Vim問題] 記録した操作を繰り返す「マクロ」の実行方法とは?

記録した操作を繰り返す「マクロ」の実行方法とは?
記事内に広告が含まれています。
スポンサードリンク

この記事では、Vim / neovim でプラグインを使わずに、記録したコマンドまたは操作を繰り返す「マクロ(複雑な繰り返し)」について、ご紹介します。

汎用性も高く、とても便利な機能ですから必ず習得しましょう。

ちなみに、マクロ/複雑な繰り返し/レコーディングなど様々な呼び方がありますが、この記事ではマクロに呼称を統一します。

スポンサードリンク

[解答] q{レジスタ} 〜 q で記録、@{レジスタ} で実行

マクロの記録

(ノーマルモードで)
q{レジスタ}  (記録開始)

・・・記録したい操作・・・

q       (記録終了)

マクロの記録中は、次のように「記録中(あるいは Recoding)」と表示されます。

zレジスタにマクロを記録開始した状態
zレジスタにマクロを記録開始した状態

マクロの実行

@{レジスタ}  (記録したレジスタの内容を再実行する)
10@{レジスタ} (記録したレジスタの内容を10回実行する)
@@        (直前に実行したマクロを再実行する)

マクロの確認

:reg {レジスタ} (記録したレジスタ(マクロ)の内容を確認する)

マクロの内容は少し分かりづらいですが、キー操作がそのまま表示されます。

レジスタx は j(下)5回、h(左)4回、k(上)6回、dd(行削除)1回を示す

マクロの削除

(ノーマルモードで)
q{消したいレジスタ} q 

つまり、消したいレジスタの中身を上書きするということになります。

マクロの編集

(インサートモードで)
Ctrl-r{消したいレジスタ}  (レジスタから登録されている内容を貼り付け)

〜貼り付けた内容を編集〜

ESCキー           (インサートモードからノーマルモードへ移行)
Ctr-vキー          (ビジュアルモードを開始)

〜編集した内容を選択〜 

"{レジスタ}y       (レジスタへ再格納)

いったんレジスタから貼り付け、編集、再格納ということになります。

実行は、通常のマクロとまったく同じです。

解説

ドットコマンドに加え、マクロは非常に強力です。

特に、マクロは複雑な操作も繰り返すことが可能になるため、使い方次第では作業が極めて楽になります。

その実態としては、名前付きレジスタに記録した内容をキー操作として認識して実行する仕組みです。そのため、ヘルプでは次のように記載されています。

q{0-9a-zA-Z"}    (レジスタの記録)
@{0-9a-z".=*+}  (レジスタの実行)

マクロの @{レジスタ} という実行方法はすべてのレジスタで使えます

また、記録には使えないレジスタがある反面、実行には使えるレジスタがあるわけです。

この仕組みが理解できていれば、柔軟に利用できるのではないでしょうか。

マクロを使うコツとしては、実行開始時のポジションを意識しないで済むようなマクロにするのが良いです。

つまり、行頭や行末に移動してから移動を始めるなどの処理を入れておくと誤った動きをしにくいわけです。

注意点としては、マクロを記録したレジスタを同じマクロ内で利用しない、あるいは貼り付けて使ったりしないことです。

これは、マクロがレジスタを活用することで起こる副作用とも言える部分ですね。

よく使う便利なVimマクロの例

簡単なものだと次のようなマクロがよく使われるようです。

行末にセミコロンを入れる

次のようなレジスタ内容を実行すれば、行末にセミコロンが入ります。

A;^[j

Shift-aキーで行末にインサートモードへ移行して、;を入力した後、ノーマルモードに戻って j で下の行に移動するわけです。

カウントして実行すれば、複数行で一気にセミコロンを挿入できます。

HTMLのリストのアイテムタグを付与する

次のレジスタの内容を実行すると、リストのアイテムタグを付与できます。

I<li>^[A</li>^[j

次のアニメーションは、3行に対して実行したものです。

3@キーで実行した様子

JavaScript で 変数を定義する

次のレジスタの内容を実行すると、JavaScriptの変数の定義・初期化できます。

Ivar ^[A = "";^[j

次のアニメーションは、5行に対して @v を5回も実行したものです。

Python で関数の定義とインデントを施す

次のレジスタの内容を実行すると、Pythonで関数の定義とインデントを施します。

Idef ^[A:^Ij>>j>>

こちらは記録したものを再生したものになります。

これはちょっと極端ですが、何度も実行する処理で かつ ノーマルモードとインサートモードを行き来する処理であれば、間違いなく積極的ンい利用すべき機能だとわかりますよね!

このVimコマンドの補足情報

  • 利用頻度5.0
  • 便利さ5.0
  • 覚え易さ3.0

関連するVimヘルプ

Vimからは、下記のコマンドでヘルプを確認できます。

:help complex-repeat
:help q
:help recoding
:help @

ヘルプで検索するときは、通常は大文字小文字は識別されませんので、どちらでも構いません。

参考書籍

こちらの書籍が参考になります。


Vim/neovim関連の書籍で、もっとも評判が良くてバイブルと呼んでる人もいる一冊です。Vim/neovimのバージョンに依存しない沢山のTips形式で、その表題通りに「思考のスピードで編集」できるようになるノウハウが詰まっています。その高い評価は Amazon のレビューからも分かる通りです。Vimmer なら必ず一度は読んでおいて間違いありません。


こちらもVim関連の書籍で評価が高い書籍の一冊です。vim-jpで見かける上級Vimmer(Vimサポーターズ)の皆様による、Vimを実践で使ったノウハウからプラグイン関連の情報が詰まっています。日本の Vim界隈を知る上でも是非一読しておきたい一冊です。

Vim/neovim の設定ファイルやプラグインなど、Vim script に関するノウハウがいくつも詰まった一冊です。日本で Vim Script をここまで深く解説している唯一の書籍と言えます。Vim力を伸ばしたいと考えるなら、絶対に避けては通れない書籍でしょう。

プロフィール
管理人
Vim太郎

Vim力アップして、そろそろ上級 Vimmer の仲間入りしたいIT系エンジニアの端くれです。読んでくる訪問者の皆様と一緒に、Vim力を上げていくことができる記事が書ければと考えています。

\フォローする/
スポンサードリンク
関連記事