【Vim】実践Vimの実践 【第2章 ノーマルモード】


# Introduction

`実践Vim`をまとめるシリーズの第 2 章です。
前回はこちらで`ドットコマンド`について解説しています。

https://qiita.com/kagami_t/items/623a56f52d10660f72ec

本記事のみで学べるよう努めますが、より詳しくかつ体系的に学びたい方は
`実践Vim`を読みながら進めることをおすすめします。

2023 年 5 月 21 日現在、`Kindle Unlimited`対象商品です。

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Vim-%E6%80%9D%E8%80%83%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%82%88%E3%81%86-Drew-Neil/dp/4048916599

`実践Vim`のサンプルコードです。
記事更新に合わせて章ごとにディレクトリを分割し、参照しやすいようにします。
※公式のサンプルはリンク切れしています。

https://github.com/kagami-tsukimura/practical-vim-practical

実際に操作することで、コマンドを効率よく定着させましょう。

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 環境

Ubuntu22.04
Vim9.0

## 第 2 章 ノーマルモード

## TIP7: 埃を払って一息つこう

> Vim を使ったことがない人には、ノーマルモードがデフォルトのモードというのは奇妙に思える。
> でも、熟練の Vim ユーザーにはそれ以外の方法があるなんて想像もつかないことだ。
> (実践 Vim「TIP7」より)

- `Vim`では`ノーマルモード`がデフォルトのモード。
- 他のテキストエディタでは、`挿入モード`に似た状態で大半の操作。
- `ノーマルモード`には、自由に使えるツールがたくさん揃っている。
  - コードの整形、コピー、移動、削除、何かの変更等。

## TIP8: アンドゥはひとまとめに

> Vim ではアンドゥコマンドの粒度を自分で制御できる。
> (実践 Vim「TIP8」より)

- `u`キーでアンドゥコマンドを実行し、直前の変更を取り消し。
- アンドゥコマンドの粒度を制御できる。
  - `挿入モード`から`ノーマルモード`に戻るまでの間が、単一で直前の変更とみなされる。
  - `<Esc>`キーを適切に使い、単語、センテンス、パラグラフにアンドゥを適用。
- `<Ctrl> + r`でアンドゥを取り消し。

## TIP9: 変更を繰り返し可能なものにする

> Vim は繰り返し処理に最適化されている。
> このことを活用するには、1 つ１つの変更をどのように積み上げていくかを常に意識する必要がある。
> (実践 Vim「TIP9」より)

- `Vim`は繰り返し処理に最適化されている。
- 処理が最適かは効率性で判断する。
  - キーストロークが最も少ない方法(`Vim Golf`)。

### 後方削除

- カーソルが行末にある状態（`$`で行末に移動）から、単語を後方削除する。
  ```text: chapter_code/2_normal/the_end.txt
  The end is nigh
  ```
  - `db`でカーソルの直前から単語の先頭まで削除。
  - `x`で残った単語「h」を削除。
  - `Vim Golf` = `3`
  ```text: chapter_code/2_normal/the_end.txt
  The end is
  ```

### 前方削除

- カーソルが行末にある状態(`$`で行末に移動)から、単語を前方削除する。
  - `b`でカーソルを単語の先頭に移動。
  - `dw`で単語を削除。
  - `Vim Golf` = `3`

### 単語全体削除

- カーソルが行末にある状態（`$`で行末に移動）から、単語を全体削除する。
  - `daw`(`delete a word`)で単語を削除。
  - `Vim Golf` = `3`

### 繰り返し性が一番高いのはどれ？

- `dbx`(後方削除), `bdw`(前方削除), `daw`(全体削除)どれも`Vim Golf` = 3
- `ドットコマンド`(`.`)で繰り返すことを考える。

  - `dbx`: `x`の 1 文字削除を実行。
  - `bdw`: `dw`のカーソルから次の単語の直前まで削除を実行。
  - `daw`: `daw`の単語と空白削除を実行。

- `daw`が最も役に立つ処理を繰り返す。

## TIP10: 回数指定を使って簡単な計算を行う

> ノーマルモードの大半のコマンドは回数を指定して実行できる。
> この機能を使うと、ちょっとした計算を行える。
> (実践 Vim「TIP10」より)

- `回数 + コマンド`で、指定した回数コマンドを実行する。

- `css`の 2 行目をコピーして、「.blog」を「.news」、「0px」を「-180px」に変更。
  ```css: chapter_code/2_normal/sprite.css
  .blog, .news { background-image: url(/sprite.png); }
  .blog { background-position: 0px 0px }
  ```
  - 2 行目で`yyp`で行コピー。
  - `cW`で「.blog」を「.news」に変更。
  - `180<Ctrl + x>`で行の最初の数字から、`-180`する。
  ```css: chapter_code/2_normal/sprite.css
  .blog, .news { background-image: url(/sprite.png); }
  .blog { background-position: 0px 0px }
  .news { background-position: -180px 0px }
  ```

## TIP11: 繰り返しで済むなら、回数を指定しない

> 回数を指定すると、何かの作業を行うのに必要なキーストロークの数を最小限のものにできる。
> だからといって、そうすべきだということではない。
> (実践 Vim「TIP11」より)

### 回数が重要なときには、回数を使おう

- 「I have a couple of questions.」を「I have some more questions.」に変更。
  - `2w`で`a`にカーソル移動。
  - `c3w`で「a couple of」を削除して`挿入モード`に入る。
  - some more を入力。

```text:
I have some more questions.
```

- 以下のような場合は`ドットコマンド`が意味をなさない可能性を考える。
  - 単語の処理量が多い。
  - 処理後に`挿入モード`に入る。
  - 回数指定のほうがアンドゥ履歴が美しくなる。

## TIP12: 統合して統治せよ

> Vim がなぜ強力なのか、その大半は、オペレータとモーションを組み合わせられるという点に由来している。
> (実践 Vim「TIP12」より)

### オペレータ + モーション + アクション

- `d{motion}`コマンドは、単一文字`d1`、単語全体`daw`、パラグラフ`dap`にも適用可。
- `c{motion}`, `y{motion}`等にも当てはまる。
  - これらのコマンドを`オペレータ`と総称する。

### 最後に

`Vim`に慣れるまで`ノーマルモード`は不便に感じると思います。
しかし第 1~2 章で紹介したコマンドを使いこなすには、`ノーマルモード`の理解が重要です。
イメージとしては、日々のコーディングが`挿入モード`です。
コーディングのための準備が`ノーマルモード`です。

また、第 1 章で紹介した`ドットコマンド(.)`は強力なコマンドを手軽に繰り返せますが、常に最適解とは言い切れません。
例えば前方 5 単語を削除したい場合は`dw....`で実現は可能です。
しかし数を数えるより`5wd`としてしまった方が`Vim`を強力に用いることができます。

また、本記事で紹介したコマンドを実際に試してみることを強くおすすめします。

最後まで閲覧頂きありがとうございました。
本記事がお役に立てば幸いです！

次回`挿入モード`

https://qiita.com/kagami_t/items/6c693f4e10450c8e9947

### 参考書籍

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Vim-%E6%80%9D%E8%80%83%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%82%88%E3%81%86-Drew-Neil/dp/4048916599

### 参考 URL

https://github.com/vim-jp/vimdoc-ja

https://github.com/yochiyochirb/practical-vim/tree/master