Core Tech Blog

株式会社Coreのエンジニアチームが日々習得した技術やTipsを公開するブログです

知っていると少し自慢できるVimの便利コマンド

Core開発部の加藤です。
元々がデフォルトで入っているエディタという部分からVimを使い始めたため、プラグインを入れてガチガチにカスタマイズするのではなく、Vimのみで出来る範囲で使っています。普段さり気なく使っているコマンドでも、Vimを使わない人からは「こんなこと出来るんだ」と驚かれた事があります。

今回は他のエディタでは馴染みの少ないと思われる、Vimの便利なコマンドをまとめてみました。

指定文字数の入力

テスト用の入力で256文字とかの文字列が欲しいというようなケースがあります。 そんな時にVimのインサートコマンドを回数指定で利用すると簡単に入力ができます。

Vimのノーマルモードでのコマンド入力は
[回数(デフォルトは1)] コマンド [範囲指定]
の順番で指定をします。

ddとすれば1行削除ですが10ddとすると10回1行を削除するので10行削除となります。

従って256ix[esc]のように回数を指定(例の場合には256)してiコマンドで一文字分挿入することで、指定回数の入力を行う事が可能です。

f:id:coreinc:20180510192507g:plain

iコマンドは挿入モードに入るためのコマンドと誤解されがちなのですが、実際には iコマンドは挿入モードで入力した文字列をカーソルの位置に入力するコマンドというような捉え方をして頂くと利用の幅が広がります。

例えば10itest[esc]と入力して頂くと、"test"という入力が10回行われます。

直前のコマンドの再実行

.コマンドは直前のコマンドを再実行するためのコマンドなのですが、前述の通りiaというのもコマンドであるため、 例えばitmp_[esc]のようなコマンドを実行すれば.を実行する毎に"tmp_"という入力がされる形となります。

f:id:coreinc:20180510192538g:plain

他にもI(行頭に挿入)やA(行末に挿入)コマンドと併用すると、例えばA,[esc]とコマンドを打つと行末に","が追加されますが、その後1行下がって(j)から.を打つとその行の末尾にも","が追加されます。

f:id:coreinc:20180510192600g:plain

ブロック単位での処理

ノーマルモードでのコマンド実行時にテキストオブジェクトという範囲を指定できるコマンドがあります。

通常の使用ではddの様に2回入力するようなコマンドで、d,y,c,>,<辺りがそれにあたります。

これらのコマンドは後ろに範囲を指定するオプションを付ける事で使い勝手がぐんとあがります。

範囲指定は コマンド [範囲指定] [ テキストオブジェクト ] のような指定方法になります。

テキストオブジェクトとしては下記の様なものがあります

キー 範囲
w word 単語
b block () で囲まれた範囲
B block {} で囲まれた範囲
p paragraph 段落(改行のみの行で囲まれた範囲)
[,(,{,<,",' 左記のキーで囲まれた範囲

範囲指定は

キー 範囲
i テキストオブジェクトの内部
a テキストオブジェクト全体

言葉だと判りにくいかと思いますが、下記の様にコマンドを打って頂くと

dip

カーソルのある段落について一度に削除する事が可能です。 (delete in paragraph)

f:id:coreinc:20180510192644g:plain

あるいは

dib(もしくはdi()

と言うコマンドを()の内部で実行して頂くと()の中身について一度に削除する事が可能です。 dabの場合には()も含めての削除となります。

f:id:coreinc:20180510192715g:plain

インデントを変更したいような場合には

>ip

とコマンドを打つことで対象の段落を、まとめてインデントを下げる事が可能です。 <iB>iBなら{}で囲まれた範囲について丸ごとインデントを下げる形になります。

f:id:coreinc:20180510194258g:plain

複数コマンドの再実行(マクロ機能)

qコマンドを利用する事で、複数のコマンドをまとめたマクロを登録して再利用する事ができます。

使い方はqの後にコマンドを登録するレジスタ([0-9a-zA-Z])を指定します、その後再度qを押す迄に実行したコマンドをマクロとしてレジスタに登録し、 登録したマクロは@コマンドで呼び出す事が可能です。

言葉だといまいち伝わりにくいかと思いますので、行の先頭に"add"という文字を追加して、行のお尻の単語を消すという処理をマクロとして登録して利用するという例を説明します。

qa (aレジスタにマクロ登録開始)
Iadd [esc] (行頭に"add "を入力)
$ (行末に移動)
diw (現在位置の単語を削除)
q (マクロ登録を完了)

これで該当の処理がaレジスタに登録出来ました。この処理を再度呼び出す時には@aとコマンドを入力します。

実際にマクロ登録をして、各単語上で@aコマンドで"で括る処理を呼び出してみます

f:id:coreinc:20180510192915g:plain

このままだと、実行のためにカーソルの位置を移動させる必要があるのでマクロの内容を少し修正します

qa (aレジスタにマクロ登録開始)
Iadd [esc] (行頭に"add "を入力)
$ (行末に移動)
diw (現在位置の単語を削除)
j (次の行に移動)
q (マクロ登録を完了)

jを追加しただけですが、こうする事で@aを実行するたびに 次の行に移動するため、わざわざ手動で移動させずに@aの繰り返しでどんどん単語に"を付けていけます。

更に@aコマンドはコマンドですので回数指定ができます。 例えば、5@aとすれば@aを5回実行出来ますので、下記の様に一度に処理することが可能です。

f:id:coreinc:20180510192957g:plain

マクロ機能はかなり応用範囲が広いので 是非使ってみて下さい。

@コマンドだけで処理が流れる様に作るのがコツです。