この記事について
Vimを使ったテキストの一括操作の方法をまとめておきます。
Vimの一番の強み・利点は、「あらゆる操作がコマンド・キーボードで完結するため、テキストの一括編集が圧倒的に早い」点だと思います。
テキストの一括操作は、日常のプログラミング・コーディング作業でも頻出です。ここでは、
- ビジュアルブロックモード
- 検索置換
などの機能を活用することになります。
関連のあるモード・コマンド
テキストの一括編集において特に重要になるのは、この2つの機能です。
機能 | コマンド | できること |
---|---|---|
ビジュアルブロックモードへの切り替え | <Ctrl-v> |
複数行に対して、同じテキスト操作を一括で可能にする |
検索置換(現在の行) | :s/置き換え前/置き換え後/g |
現在の行にある対象文字列をすべて置換する |
Vimの豊富な機能・コマンドの中でも、この2つは特に便利で、いろいろなことに応用できます。そのため、慣れるまで反復練習をする価値も大きいです。
具体的な利用場面
マークダウンのリストをHTMLのリストに変換する
- りんご
- みかん
- ぶどう
上記のテキストなら、
- ビジュアルブロックモード(
Ctrl
+v
)で、先頭の「-」を選択 -
x
などで一括削除 - ビジュアルブロックモード(
Ctrl
+v
)で各行の先頭を選択 - 挿入モード(
Shift
+i
)で<li>
と入力し、ESC
-
- ビジュアルブロックモード(
Ctrl
+v
)で各行の末尾を選択
- ビジュアルブロックモード(
- 挿入モード(
Shift
+i
)で</li>
と入力し、ESC
-
gg
で先頭に移動し、挿入モード(i
)で<ul>
と入力 -
G
で末尾に移動し、挿入モード(i
)で</ul>
と入力
<ul>
<li>りんご</li>
<li>みかん</li>
<li>ぶどう</li>
</ul>
ビジュアルブロックモードと挿入モードを行き来するイメージですね。
テキストの先頭(gg
)や末尾(G
)へのジャンプも、しっかり活用しています。
カンマ区切り文字列すべてに、引用符(”)をつける
aaa,bbb,ccc
- ビジュアルブロックモード(
Ctrl
+v
)で、文字列全体を選択し、ESC
で、コマンドモードに戻る -
:s/,/","/g
と入力し、カンマ(,
)の前後に引用符("
)をつける -
gg
で先頭に移動し、挿入モード(i
)で"
を付け足し、ESC
で、コマンドモードに戻る -
G
で末尾に移動し、挿入モード(i
)で"
を付け足し、ESC
で、コマンドモードに戻る
"aaa","bbb","ccc"
CSVファイルのヘッダーを作成するときや、JSON形式で項目名を作るときに、よく出てきます。
引用符つきの単語リストから、引用符を外す
今度は逆に、引用符(”)を外す操作です。
"aaa","bbb","ccc"
考え方は何も変わらず、
- ビジュアルブロックモードで全範囲選択
- 文字置換(
:s/,/"//g
)
で、いけます。
引用符(”)を削除するという作業のみで足りる分、引用符(”)を新たに付け足すよりも簡単です。
aaa,bbb,ccc
CSVのヘッダー名をそのままプログラムの変数名として使いたい場面では、こうした作業も出てきます。
各行のインデントをとる
aaa
bbb
ccc
- ビジュアルブロックモード(
Ctrl
+v
)で、不要なインデントにあたる箇所を指定 -
d
でインデント削除
aaa
bbb
ccc
本質は、各行の先頭を範囲指定し、削除するということです。
したがって、先頭にあるカンマ(,
)をまとめて除去する場合も、同じ要領でできます。
aaa
,bbb
,ccc
aaa
bbb
ccc
各行にカンマ(,
)を追加する
aaa
bbb
ccc
- ビジュアルブロックモード(
Ctrl
+v
)で、各行の先頭を指定 -
Shift
+i
で挿入モードに切り替え、カンマ(,
)を入力し、ESC
aaa
,bbb
,ccc
これも、各行の先頭を範囲指定し、任意の文字を追加することが本質です。
したがって、変数名にデータ型指定を追加する場合も、同じです。
var1
var2
var3
int var1
int var2
int var3
挿入モードの切り替え時に、Shift
+ i
とする点を忘れやすいです。(たんにi
とするだけではダメ。)
Ctrl
+ v
→Shift
+ i
という流れで覚えましょう。
tsvファイルをcsvファイルに変更する
banana apple orange
- tsv:tab(
- csvファイル:カンマ(
,
)区切り
ここまで見てきた人なら、もう楽勝だと思います。
はい、tabをカンマに変えるだけ、つまり文字置換でいけますね。
- ビジュアルブロックモード(
Ctrl
+v
)で、対象範囲を選ぶ
→ggVG
とかでテキストを全範囲選択すればOK - 文字置換(
:s/<tab>/,/g
)
banana,apple,orange
検索方法・ビジュアルモードの詳細
以下は補足です。
様々なビジュアルモード
本記事で紹介したのは、ビジュアルブロックモードのみですが、実はビジュアルモードにもいくつか種類があります。
モード名 | コマンド | できること | 主な用途 |
---|---|---|---|
ビジュアルモード (Visual Mode) | v |
文字単位で選択 | 1単語だけ色を変える、特定の部分だけ削除するなど |
ビジュアルラインモード (Visual Line Mode) |
<Shift> + v
|
*行単位で選択 | 複数行のコメントアウト、一括削除など* |
ビジュアルブロックモード (Visual Block Mode) |
<Ctrl> + v
|
矩形(ブロック)単位で選択 | ⭐︎もっとも重要。変数名の先頭に型情報を追加、JSONのキーへの引用符を追加など。 |
もっとも重要なのは、ビジュアルブロックモードだと思います。
なぜなら、
- 一文字ずつの操作(ビジュアルモード)
→ 挿入モード(:i
)での一文字ずつの操作で足りるため - 一行ずつの操作(ビジュアルラインモード )
→ 行単位での一括操作(削除ならdd
、コピーならyy
など)で足りるため
といった理由から、あえてビジュアルモードに頼る必要性がないためです。
一方でビジュアルブロックモードは、複数行に一括で同じ文字列操作を適用するなど、他の機能で代替しづらい役割があります。
そのため、複数あるビジュアルモードの使い分けがややこしい、と悩むくらいなら、まずはビジュアルブロックモードの活用に慣れるのがおすすめです。
様々な検索置換の手法
また、検索置換の方法も様々です。
コマンド | 説明 | 備考 |
---|---|---|
:s/error/fix/g |
現在の行の "error" をすべて "fix" に置換 | ⭐︎最重要 |
:%s/error/fix/g |
ファイル全体の "error" をすべて "fix" に置換 | |
:%s/error/fix/gc |
置換ごとに確認しながら実行 | |
:%s/error/fix/gi |
大文字小文字を区別せずに置換 |
本記事では一番上:s/error/fix/g
しか紹介していませんが、このように検索方法も実は色々です。
※本当は、ここに掲載しきれないほど沢山あります。
流石に全部は覚えきれないので、どんなことができるかだけざっくり把握して、必要になったら都度調べるのがおすすめです。
作業時の注意点:検索時には、'<,'>
という表記があるのを確認
これはビジュアルブロックモードの選択範囲が、検索対象になっているという意味です。
これが出ていれば、s/error/correct/g
の構文に沿って、文字置換ができます。
筆者のマシンで:
したときが上記の表示。左下に注目。
まとめ
本記事では、テキストの一括操作を取り上げました。この辺りの作業は、慣れていないとついマウスとキーボードを何往復もしがちです。そして時間をかけた作業ほど、ミスもしがちなんですよね。
一方Vimを使うとキーボードだけで完結するため、慣れればとにかく早いです。
テキストの取り扱いがシステマチックに行えるというVimの強みが伝われば嬉しいです。普段は自分の好きなエディタ(VSCodeなど)を使うとしても、こうした一括テキスト操作をする際、Vimの活用も検討してみてください。
筆者からひと言
他にも便利なVimの置換技や活用法を知っている人は、ぜひコメントで共有してください。
関連記事
本記事は、
の続編です。Vimのコマンド操作に全般慣れていないという人は、まずはこちらを参照してください。
また、Vimって何?触ったことすらないんだけど? な人は、
こちらを参照してください。