CLIツール

【Vim/NeoVimマクロ】作成/保存/追記/定義/格納場所など使用例も解説

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

本記事では、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のあとに、,を入力するマクロを作成してみようと思います。

下記のような手順です。

順序

  1. まず、一番上の行にカーソルをおいて、qqとかでレコーディング開始。
  2. 0で先頭にカーソルを持っていき、
  3. fgで直近のgにカーソルを持っていき、
  4. aでインサートに入り、,を入力しesc。
  5. 最後に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の方もご覧いただけますと幸いです。

https://qiita.com/reisuta

  • この記事を書いた人
  • 最新記事

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

おすすめ記事はこちら

Vim/Neovimプラグイン 1

プラグインをどれだけ入れるかは、その人の思想なども関係するので、一概にこれがいいというのはないかもしれません。 プラグインを全く入れない人もいれば、100個以上入れる人もいます。 ただそれでも、これだ ...

VimとNeovimの比較 2

本記事では、VimとNeovimの違いについて、解説します。 VimとNeovimの違いについては、普段頻繁にVimなどを使う方でなければ、正直、あまり気にしなくてもいいかなと思います。 ただ、Vim ...

Ruby変数やすべてがオブジェクトについて 3

本記事は、Rubyの基礎文法である、変数や真偽値、論理演算子に触れると同時に、「すべてがオブジェクト」というRubyの特徴的な思想についても解説します。 この思想は、Rubyの文法の根幹になっているの ...

4

エンジニアにおすすめの技術書 書籍学習は、エンジニアの嗜みみたいなところがありますが、 良書というものは、意外とそこまで多くもありません。 そこで本記事では「技術書マニアの筆者が厳選した技術書20選」 ...

5

エンジニアになるには? プログラミングは、専門性が高く自分一人で勉強するのが大変に感じることも多いですよね。 そこで本記事では「おすすめのプログラミングスクール5選」を特徴と、現役エンジニア目線で優れ ...

-CLIツール