Introduction
実践Vimをまとめるシリーズの第 4 章です。
第 1 章:ドットコマンド
第 2 章:ノーマルモード
第 3 章:挿入モード
本記事のみで学べるよう努めますが、より詳しくかつ体系的に学びたい方は
実践Vimを読みながら進めることをおすすめします。
2023 年 6 月 12 日現在、Kindle Unlimited対象商品です。
実践Vimのサンプルコードです。
記事更新に合わせて章ごとにディレクトリを分割し、参照しやすいようにします。
※公式のサンプルはリンク切れしています。
実際に操作することで、コマンドを効率よく定着させましょう。
本記事が少しでも読者様の学びに繋がれば幸いです!
「いいね」をしていただけると今後の励みになるので、是非お願いします!
環境
Ubuntu22.04
Vim9.0
第 4 章 ビジュアルモード
Vimのビジュアルモードでは、テキストを選択して操作を行う。
ビジュアルモードには以下の 3 種類がある。
- 文字を扱う。
- 行を扱う。
- 矩形領域を扱う。
繰り返しにはドットコマンドが有効。
TIP20: ビジュアルモードとは
ビジュアルモードではテキスト範囲を選択して、それらに操作を加えることができる。
(実践 Vim「TIP20」より)
-
ノーマルモードコマンドの大半はビジュアルモードでも使用可能。-
ビジュアルモードのカーソル移動で、テキスト選択領域を指定する。
-
TIP21: ビジュアルな選択範囲の定義
ビジュアルモードには 3 つのサブモードがあるが、これらはそれぞれ異なる種類のテキストを扱う。
(実践 Vim「TIP21」より)
- 3 種類の
ビジュアルモード- 文字指向 : 個々の単語やフレーズを操作する。
- 行指向 : 行全体を操作する。
- ブロック指向 : ドキュメント中の矩形領域を操作する。
ビジュアルモードの有効化。
-
ビジュアルモードに切り替え。-
vで文字指向のビジュアルモードに切り替え。 -
Vで行指向のビジュアルモードに切り替え。 -
Ctrl + vでブロック指向のビジュアルモードに切り替え。 -
gvで`直前の選択範囲を再選択。
-
TIP22: 行指向のビジュアルモードコマンドを繰り返す。
ビジュアルな選択範囲に対して行った変更をドットコマンドで繰り返すと、テキストの同じ範囲に対してその変更が繰り返される。
(実践 Vim「TIP22」より)
-
ビジュアルモードでインデントする。1chapter_code/4_visual/visual_mode/fibonacci-malformed.pydef fib(n): a, b = 0, 1 while a < n: print(a) a, b = b, a+b fib(42)-
3jで 4 行目に移動する。 -
Vで行指向のビジュアルモードに切り替え。 -
jで 1 行下も選択する。 -
>でインデントする。 -
.でインデントを繰り返す。
chapter_code/4_visual/visual_mode/fibonacci-malformed.pydef fib(n): a, b = 0, 1 while a < n: print(a) a, b = b, a+b fib(42) -
TIP23: 可能ならばビジュアルコマンドではなくオペレータを優先しよう
Vim のノーマルモードでの操作と比べて、ビジュアルモードのほうが直感的かもしれないが、これには弱点がある。
常にドットコマンドとうまく連携できるとは限らないのだ。
ノーマルモードのオペレータを適切に使えば、この弱点を回避できる。
(実践 Vim「TIP23」より)
ビジュアルオペレータを使う
- リンクを大文字に変換する。
chapter_code/4_visual/visual_mode/list-of-links.html
<a href="#">one</a> <a href="#">two</a> <a href="#">three</a>-
vitで a タグの内容を選択する。 -
Uで選択した文字列を大文字に変換する。
chapter_code/4_visual/visual_mode/list-of-links.html<a href="#">ONE</a> <a href="#">two</a> <a href="#">three</a>-
j.j.で残りの行も大文字変換を試みる。-
ビジュアルモードのコマンドは同じ範囲しか繰り返されない。 - 元々のコマンドが 3 文字に適用したため、3 文字しか繰り返されない。
-
chapter_code/4_visual/visual_mode/list-of-links.html<a href="#">ONE</a> <a href="#">TWO</a> <a href="#">THRee</a> -
ノーマルオペレータを使う
- リンクを大文字に変換する。
chapter_code/4_visual/visual_mode/list-of-links.html
<a href="#">one</a> <a href="#">two</a> <a href="#">three</a>-
gUitで a タグの内容を大文字に変換する。-
gU:ビジュアルモードのUと同様のコマンド。
-
chapter_code/4_visual/visual_mode/list-of-links.html<a href="#">ONE</a> <a href="#">two</a> <a href="#">three</a>-
j.j.で残りの行も大文字変換する。
chapter_code/4_visual/visual_mode/list-of-links.html<a href="#">ONE</a> <a href="#">TWO</a> <a href="#">THREE</a> -
TIP24: ブロック指向のビジュアルモードで表形式のデータを編集
どんなエディタでもテキスト行は扱える。
でも、テキスト列を操作するにはもっと専門的なツールが必要だ。
Vim にはこの機能がある。
(実践 Vim「TIP24」より)
- プレーンテキストを表形式に加工する。
chapter_code/4_visual/visual_mode/chapter-table.txt
Chapter Page Normal mode 15 Insert mode 31 Visual mode 44- 列間に移動する。
-
Ctrl + vでブロック指向のビジュアルモードに切り替え。 -
3jで 3 行下まで選択する。 -
x...で列間を削除する。 -
gvで直前の選択範囲(4 行分)を再選択。 -
r|で選択範囲をパイプ(|)に置換する。 -
yypで先頭行をコピーする。 -
Vr-でコピーした行の文字すべてをハイフン(-)に置換する。
chapter_code/4_visual/visual_mode/chapter-table.txtChapter | Page ------------------- Normal mode | 15 Insert mode | 31 Visual mode | 44
TIP25: テキスト列の変更
ブロック指向のビジュアルモードを使うと、テキストを一度に複数のテキスト行へ挿入できる。
(実践 Vim「TIP25」より)
-
ブロック指向のビジュアルモードでパスを変更する。chapter_code/4_visual/visual_mode/sprite.cssli.one a{ background-image: url('/images/sprite.png'); } li.two a{ background-image: url('/images/sprite.png'); } li.three a{ background-image: url('/images/sprite.png'); }-
f/lで/の後ろまで移動する。 -
Ctrl + vでブロック指向のビジュアルモードに切り替え。 -
jjeで 3 行分のimagesを選択する。 -
cで選択範囲を削除して挿入モードに切り替え。 -
componentsと入力する。 -
Escでノーマルモードに切り替え。2
chapter_code/4_visual/visual_mode/sprite.cssli.one a{ background-image: url('/components/sprite.png'); } li.two a{ background-image: url('/components/sprite.png'); } li.three a{ background-image: url('/components/sprite.png'); } -
TIP26: 矩形状ではないビジュアルな選択範囲にテキストを追加
ブロック指向のビジュアルモードは、コードを矩形状に選択して、そこに操作を加えるときにはすばらしく役に立つ。
でも、矩形状のテキスト範囲でないと使えないというわけでもない。
(実践 Vim「TIP26」より)
-
長さの異なる各行の末尾にセミコロン(;)を追加する。3
chapter_code/4_insert/insert_mode/2_foo_bar.jsvar foo = 1 var bar = 'a' var foobar = foo + bar-
Ctrl + vでブロック指向のビジュアルモードに切り替え。 -
jj$で 3 行分の末尾まで選択する。 -
A;で各行の末尾にセミコロン(;)を入力する。 -
Escでノーマルモードに切り替え。2
chapter_code/3_insert/insert_mode/replace.txtTyping in Insert mode extends the line, but in Replace mode the line length doesn't change. -
最後に
ビジュアルモードは前回の挿入モード、前々回のノーマルモードと比べて馴染みがなかったかもしれません。
知らなくてもエディタとして最低限の役割を果たせますし、ビジュアルでも 3 種類に分かれています。
もし難しく感じたら、ブロック指向(Ctrl + v)から試してみてください。
操作自体はノーマルモードと大差ないため、覚える内容に対しての効果は大きいです。
また、本記事で紹介したコマンドを実際に試してみることを強くおすすめします。
最後まで閲覧頂きありがとうございました。
本記事がお役に立てば幸いです!
次回コマンドラインモード
参考書籍
参考 URL