本記事では、Vimのマクロについて解説します。
マクロは、Vimの機能の中でも、
応用的なトピックだと思いますが、
使いこなせると便利なので、本記事で作成、保存、定義、
格納場所といった基本事項を解説します。
Vimの基本を学習したい方は、
こちらの記事を先に御覧ください。
本記事の内容は、下記の動画でも
ご紹介しているので、動画でハンズオンしたい方は、
ご参考ください。
マクロとは?
Vimのマクロとは、
一連の作業とかを保存して、
効率化したいときに使える、
自動化処理の方法です。
レコーディングといったりすることもあります。
qキー押して、
任意のレジスタを指定すると、
マクロの記録を開始し、
recording @ eみたいな感じで表示されます。

例えば、
aレジスタにマクロを記録したいときは、
ノーマルモードでqaとすればレコーディング開始となります。
終了するときは、もう一度qキーを押します。
マクロは、レジスタに保存されるので、
名前付きレジスタになにか格納していたとき、
同じレジスタを指定するとマクロで上書きされてしまいます。
なので、レジスタ周りで衝突しないよう注意する必要があります。
レジスタって何?っていう人は
こちらの記事で解説しているので、
ご参考ください。
-
-
参考【保存必須】Vimレジスタ完全解説 これだけは知っておきたい10種類のレジスタ
最近では、Neovimのプラグインが優秀すぎて、素のVimの機能を使用しなくても、十分便利に使うことがなってきたかもしれません。 しかし、プラグインを使わずとも、Vimには、便利な機能がたくさんあり、 ...
続きを見る
マクロの実行
マクロを実行するときは、
@ {register}でできます。
@@ だと直前に呼び出されたマクロを実行できます。
試しにちょっとしたマクロを作成してみます。
次のようなコードが合ったとします。
Plug 'Shougo/vimproc.vim', {'do' : 'make'}
Plug 'https://github.com/ycm-core/YouCompleteMe'
Plug 'vim-test/vim-test'
Plug 'https://github.com/vim-scripts/ScrollColors'
Plug 'kyazdani42/blue-moon'Plug 'https://github.com/AlessandroYorba/Breve.git'このファイルで、Plugのあとに、,を入力するマクロを作成してみようと思います。
下記のような手順です。
順序
- まず、一番上の行にカーソルをおいて、qqとかでレコーディング開始。
- 0で先頭にカーソルを持っていき、
- fgで直近のgにカーソルを持っていき、
- aでインサートに入り、,を入力しesc。
- 最後にjで下の行に移動し、qを押しレコーディング終了。
qq 0fga, <esc> j qという流れになります。
マクロを並列に実行する
通常どおり、マクロを@ qとかで
実行すると、直列で実行され途中でエラーがあれば止まってしまいます。
例えば、
Plug 'Shougo/vimproc.vim', {'do' : 'make'}
Plug 'https://github.com/ycm-core/YouCompleteMe'
Plug 'vim-test/vim-test'
" 邪魔するぜーーー
Plug 'https://github.com/vim-scripts/ScrollColors'
Plug 'kyazdani42/blue-moon'Plug 'https://github.com/AlessandroYorba/Breve.git'こんな感じで、規則性に合わないコードが途中に混ざると、
上記のマクロの場合、fgのところで
gが見つからず、そこで処理が止まります。
こういった問題を回避するには、
並列に実行する方法があります。
マクロの内容は、
qq 0fga, <esc> q
と、jで下の行に進む以外は同じです。
その後に、Vで行をヴィジュアルモードで選択して、
:'<,'>normal @@でマクロを実行します。
こうすると、並列に実行されるため、
こける行があっても、他の行は正常に実行されます。
これはそれぞれの呼び出しが独立しているからです。
マクロの追記
マクロを記録する際、
「jするの忘れた!」ってなった際、
また、1からqqなんてすると、
以前のマクロは上書きされてしまいます。
その場合は、マクロに追記すると良いと思います。
追記する際は、qQとレジスタを大文字にすれば大丈夫です。
マクロ使用例
以下、マクロの使用例をご紹介します。
後半では、マクロの編集とinit.vimへの定義方法などについても
言及します。
Rubyファイル
1つ目の例として、
Rubyファイルでのマクロを取り上げます。
例えば次のようなファイルがあるとします。
class Test
endこれを次のような感じにしたいとします。
Module Api
class Test
end
endRailsのAPIモードとかでおなじみのネームスペースです。
これは、マクロの手順としては、
順序
1、ggで先頭行に移動
2、Oで上の行にinsertモード
3、module Apiと入力して<esc>
4、jで下の行に移動して、>Gで末尾の行までインデントを一段深くする
5、Gで末尾にカーソルを移動し、oで下の行にinsertモード
6、endと入力して<esc>で<<でインデントを戻す
このような感じになります。
Railsをよく使う人は、
このようなマクロをinit.vimに保存する(後述)のも面白いかもしれません。
インクリメント系
次は、インクリメンタル系をご紹介します。
こんなファイルがあるとします。
今日はいい天気
昨日はまずまず
一昨日は普通
明日はおそらくいい天気
去年の今日はどんな天気?このファイルを、
1) 今日はいい天気
2) 昨日はまずまず
3) 一昨日は普通
4) 明日はおそらくいい天気
5) 去年の今日はどんな天気?みたいにインクリメントした(数字)を入れたいとします。
こうしたマクロを作るには、
ポイント
1、:let i=1で変数iの初期値を1に設定する
2、qaでレジスタaにマクロを記録開始
3、Iで先頭にカーソル持ってきてinsertモード
4、<C-r>=i<CR><esc>でExpressionoモードを交えつつ、変数iの値を挿入して ) でエスケープ
5、:let i += 1でインクリメントk
6、qで記録終了
実行する際は、こちらの場合は、
並列にマクロを実行します。
こういうインクリメンタルも、
地味に使う時があったりするので、
覚えておくと便利かもしれません。
マクロの編集
次にマクロの編集についてふれます。
まず、マクロもレジスタに保存されています。
試しに、aレジスタの内容を
末尾に貼り付けてみます。
Gで末尾の行に移動して、
:put aでレジスタの内容を貼り付けます。
そして、貼り付けられたものを
編集して、aレジスタに保存し直すには、
"addでできます。
この操作自体は
aレジスタにddで格納しているだけなので、
マクロもレジスタも関係ありません。
マクロといっても、
要はレジスタに格納されている、
一連の操作みたいな感じだということがわかります。
マクロの編集はこのようにして、
行うこともできます。
マクロの定義
最後にinit.vimでのマクロ定義に言及します。
頻繁に使うマクロとかは、
毎度毎度レコーディングするのも面倒なので、
init.vimとか.vimrcに定義してしまうと楽だと思います。
コード例としては、
let @q = ';;a;' " これは行末にセミコロンを入れるマクロで、qレジスタに定義している。のような感じです。
これでvimを開いた段階で、
すでにqレジスタにこのマクロが定義されている状態になります。
よろしければ、Qiitaの方もご覧いただけますと幸いです。