本記事では、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
end
Railsの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の方もご覧いただけますと幸いです。