Vimの複雑なコマンドを理解する

# 対象者
Vim覚えたての人〜中級者
`ci'`とか`yap`などのコマンドを見ても何してるかピンと来ない人

# 前置き
`h` `j` `k` `l`でのカーソル移動、モードの行き来、保存したりアンドゥ・リドゥしたりといった簡単なVimコマンドは使えるようになったが、コマンドを駆使してもっと効率的に作業したい！という方のためにVim初心者である私が覚えていった効率的にコーディングするテクニック・考え方を自分のメモ代わりに紹介します

これを読む頃には`ci'`とか`yap`とか`gUap`を理解できることを目指します

# Vimコマンドの覚え方

Vimのコマンドってなんだか覚えづらい！そう思っている方多そうですよね
かくいう私もそうでした
でも英語の文法とかと一緒でちゃんと意味づけて覚えると覚えやすいですよ

### どういうコマンドがわかりづらい？
`ci'`や`yap`なんてコマンド、見た事あるけどよくは知らないor機械的に覚えてるだけって人が多いんじゃないでしょうか
これらのVimコマンドを理解するためには下記を理解するとよりわかりやすくなります

### コマンドの仕組み
コマンドを分解するとオペレータというものとモーションというものに分けられます

#### オペレータ(operator)
- **命令**するためのコマンド
- `d`コマンドは削除、`y`コマンドはヤンク（コピー）、`gu`コマンドは小文字にする、等

これは最低限の操作として知ってると思います
これらのコマンドを知らないとVim操作自体が出来ないですしね
この**オペレータってのはいわゆる動詞**です
動詞だけだと何するかはわかるけど、**どこまで**操作するかといった情報がありません

下記に書いたモーションを組み合わせることによって本領を発揮します
これを知ると控えめに言って世界が変わります


#### モーション(motion)
- **適用範囲**を指定するコマンド
- `aw`は**a word**（単語）、`ap`は**a paragraph**（段落）、`i'`はinnter' （シングルクォーテーション内）等

私はこれを知った時衝撃が走りました
今までエディタで
「Shiftキー押しながらカーソルキーでカーソルを移動して範囲を選択」
なんてやっていた事がまさかのキー2個で出来てしまうなんて！ｗ

以下にコマンドを理解するために覚えるべきたった2つのルールを書きます
これだけ覚えれば冒頭のコマンドは理解できるようになるはずです

### コマンドのルール
#### ルール1： コマンドはオペレータ＋モーションで構成される
ほとんどのオペレータコマンドは実はそれ単体で入力するだけでは何も起きません

オペレータコマンドを入力するとオペレータ待機モードというものになり、**次の入力を求める状態**になるのです
ここでさきほど覚えたモーションを入力することによって範囲を指定できるのです

例えばオペレータ`d`とモーション`aw`を組み合わせて
`daw`
と続けて入力すると**カーソル下の単語の削除**のコマンドとなります
（さきほどの覚え方で考えると**delete a word**ですね）

#### ルール2: 連続したオペレータの範囲は現在行に適用される
先ほど説明したオペレータ待機モード時に
**モーションではなく同じオペレータを入力すると現在行にモーションが適用**されます

例えばオペレータ`d`を入力して
`dd`
とすると**カーソル行の削除**のコマンドになります

これは無意識にそういうものだとして覚えている人も多いのではないでしょうか？
ただちゃんと仕組みとしてわかると理解が進みますよね

現在行をコピーしたいなら`yy`か🤔など覚えやすいですね！

:::note info
例外として、`gU`コマンドみたいに2文字以上のオペレータなら`gUU`となります
:::

この2つのルールさえ把握していればVimのコマンドもほとんど理解できたも同然です


ちゃんと理解していると新しいオペレータやモーションを覚えた時にいくらでも応用が効くので楽ですね

# 終わりに
私はVimコマンドを覚えることは**英語などの言語学習に似ている**と思います
`d`や`aw`などのボキャブラリーを覚えることによってそれを組み合わせて会話形式に命令を出せる
より楽に入力したい！と思うのならVimのボキャブラリーを増やせばいいだけですね😄

:::note info
公式Docにすべてのオペレータとモーションが載っているのでふと眺めると新たな気づきが得られて面白いです
[Vim documentation: motion](http://vimdoc.sourceforge.net/htmldoc/motion.html#operator)
:::

# 番外編
各コマンドの役割覚え方を掘り下げていきます
覚える手助けになれば幸いです

### オペレータコマンドの覚え方
#### `c`コマンド
**change**の略
選択文字を削除後に挿入モードへ移行
`i`で挿入モードに入ってバックスペースで削除して〜なんてやってる人はすぐにこれを使ってください
`c`コマンドだけで両方できます

#### `d`コマンド
**delete**の略
文字入力する必要がなく削除する場合はこちら
レジストリにヤンクされるので順番入れ替えたり、いわゆるカット&ペーストにも使えます

#### `y`コマンド
**yank**の略（ヤンクとはコピーのこと）
コピーするだけの時はこちら

#### gU　大文字化
#### gu　小文字化
#### g~　大文字小文字をトグル
**uppercase**の略（たぶんｗ。小文字の`u`はその逆ってことで）
選択文字の大文字小文字を変更します
個人的にはあまり使わない

#### `>`コマンド
選択行のインデントを深くする
矢印的な覚え方でOK 「→」

#### `<`コマンド
選択行のインデントを浅くする
矢印的な覚え方でOK 「←」


#### 以下、徐々に追記予定


# 参考
[実践Vim　思考のスピードで編集しよう！ (アスキー書籍)](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%EF%BC%81-%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E6%9B%B8%E7%B1%8D-%EF%BC%A4%EF%BD%92%EF%BD%85%EF%BD%97-%EF%BC%AE%EF%BD%85%EF%BD%89%EF%BD%8C-ebook/dp/B00HWLJI3U/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2YHN1ODRFUF3O&keywords=%E5%AE%9F%E8%B7%B5vim&qid=1653880645&sprefix=%E5%AE%9F%E8%B7%B5+vim%2Caps%2C199&sr=8-1)
超絶良書です。2回読んだけど読めば読むだけ新たな気づきがあります
この記事を読んでVimに目覚めたら是非読んでほしい本です！