Vimを布教するならこんなふうに


advent calendar5日目にして途絶えそうだったので2週目

## これは
自分が感じるvimのいいところ/好きなところをまとめて、こんなことができるよと初学者に伝えるためのもの
もちろん他にもあるけれど人に布教するならここかな！という部分を挙げる

## TL;DR
コード埋め込みの部分がほぼ本編

```
こんな部分
```

## 前提条件
- 謝罪
    - タイトル詐欺、タイトルイキリ
        - [元（ネタ？）](https://www.amazon.co.jp/dp/B018V21MIW)
- 環境
    - VIM - Vi IMproved 8.1 (2018 May 18, compiled Sep 18 2019 03:49:48)
- 要求
    - タッチタイピング
        - 自分はvimを使いたくて習得した
- 他のエディタの経験（記事を書いてる人の）
    - Atom
    - Sublime
    - VSCode

## 書かないこと
- 入門のような基本操作の列挙
- vimrcによる設定や拡張
- 他エディタとの比較
- 熱意
    - 本当は *だってvim使ってるとかっこいいじゃん！！！* とか書きたい

## 参考文献

この記事の執筆はもちろん、その他も含めた知識全般はこちらから

- [Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/)
    - 困ったら基本的にこちら
- [ドットインストール: vim入門](https://dotinstall.com/lessons/basic_vim)
    - vimtutorが有名だが自分はドットインストール推し
- [実践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-Drew-Neil/dp/4048916599/)
    - 思考のスピードで編集しようってかっこよすぎる

## 予備知識
説明の都合上、モードの概念が登場するので補足
これは研究室の後輩に向けて作成した過去資料なので**資料中の厳密さや、悪ノリにはご容赦いただきたい**
![mode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176375/7ce1556c-38cb-57c5-bc4a-397971a7e655.png)
![mode_change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176375/eb5d8641-d797-576e-b5aa-0b678eeb44dc.png)

## 本編
### いいところ/好きなところ

#### よく言われていること
キーボードで操作が完結する
カーソル移動はもちろんコピーやペーストなどの編集も可能で、OSのショートカットキーよりも楽である

e.g.
- 左`h`、下`j`、上`k`、右`l`
-  `Ctrl + C`、`CMD + C`ではなく`y`や`yy`でコピー（ヤンク）

ここはこんな感じで短めに

#### 操作の種類
一見するとほぼ同じような、似た操作が多く存在するが、適切な操作を選択できると結果的に同じ操作であっても単純に打鍵数が減る

- NormalモードからInsertモードに入る操作、思いつくだけ(操作表記の都合で`c`は省く)
    - `i`: カーソル位置からInsertモードに入る
    - `a`: カーソル位置の直後からInsertモードに入る
    - `s`: カーソル位置の文字を削除してInsertモードに入る
    - `o`: カーソル行の下に新たに行を挿入してその行でInsertモードに入る
    - `I`: カーソル行の先頭からInsertモードに入る
    - `A`: カーソル行の末尾からInsertモードに入る
    - `S`: カーソル行の文字を削除してInsertモードに入る
    - `O`: カーソル行に新たに行を挿入してその行でInsertモードに入る

`A`と`$a`や`O`と`ko`がほぼ同じ操作となる。（`$`は行末への移動）
また、リピートなどを考慮するとさらに大きな差となる（後述）

#### テキストオブジェクト
>テキストオブジェクトは基本操作方法の一つです。
https://vim-jp.org/vimdoc-ja/usr_04.html#04.8

定義としては操作のことであるらしいが、`テキスト中にて、”ある単位”でオブジェクトを認識してくれる機能`だと考えても良いと思う

- よく使うオブジェクトの単位
    - 単語: スペース区切りでは確実に認識される、日本語は綺麗に書かないと期待する認識はされない
    - タグ: html, xmlでの`<tag>`
        - vue.jsなどのタグを認識するためには拡張の必要がある可能性がある（拡張なしでは未検証）
    - 記号: `"`, `'`, `(`, `[`, `{`, `<`で囲まれている

これらに対してさらに

- 操作
    - 削除
    - 編集
    - コピー
- 範囲（タグor記号）
    - 内側のみ
    - 全体

などを指定して実行できる、具体的には

`c`or`d`or`y`（操作）
**+**
`i`or`a`(範囲)
**+**
`t`or`w`or`"`or`'`or`(`or`[`or`{`or`<`（対象）
といった感じで使うことが多い

##### e.g. part1

```python:python
print("hello")
```
hの上で`di"`と入力すると

```python:python
print("")
```
"の上で`da(`と入力すると

```python:python
print
```

##### e.g. part2

```html:html
<div class="myclass"><p>hello world</p></div>
```

wの上で`dat`と入力すると

```html:html
<div class="myclass"></div>
```

mの上で`da<`と入力すると

```html:html
</div>
```




#### 単発繰り返し（マイクロマクロ）

>**1.単発繰り返し single-repeat**
最後の変更を繰り返す。変更の回数は[count]で指定した回数で置き換えられる。'cpoptions' に 'y' フラグが含まれてる時には、ヤンクコマンドも繰り返す。コマンドラインコマンドは繰り返さない。
https://vim-jp.org/vimdoc-ja/repeat.html#single-repeat

つまり、`.`はテキストに対して最後に行った編集を繰り返すコマンドである
どこかでみかけたマイクロマクロという呼び方で呼んでいた
汎用性の高い？抽象的な？操作を心がけていると、このコマンドはより高い利益をもたらしてくれる

##### e.g.  

```python:python
print("hello")
# hの上で di" と入力すると（このコメントはマイクロマクロに関係ありません）
print("")
# "の上で da( と入力すると（このコメントはマイクロマクロに関係ありません）
print
```

1行目の任意の位置で`I# <Esc>`と入力すると

```python:python
# print("hello")
# hの上で di" と入力すると（このコメントはマイクロマクロに関係ありません）
print("")
# "の上で da( と入力すると（このコメントはマイクロマクロに関係ありません）
print
```
3行目5行目のそれぞれ任意の位置で`.`と入力すると

```python:python
# print("hello")
# hの上で di" と入力すると（このコメントはマイクロマクロに関係ありません）
# print("")
# "の上で da( と入力すると（このコメントはマイクロマクロに関係ありません）
# print
```

このとき、`0i# <Esc>`を使うと`.`は最後に行った`i# <Esc>`しか記憶しないため期待する動作にはならない（`0`は行頭への移動）

これは単純な例だが、`.`の存在を踏まえて編集操作を選択すればより大きな恩恵を享受できる（学びはじめの頃は楽しい）

#### 複雑な繰り返し（マクロ）
>**3. 複雑な繰り返し complex-repeat**
タイプした文字をレジスタ{0-9a-zA-Z"}にレコーディングする(大文字なら追記)。レジスタを実行中は 'q' コマンドは無効化される。マッピングや :normal の中でも機能しない。
https://vim-jp.org/vimdoc-ja/repeat.html#complex-repeat

すなわち、文字のキーに複雑な処理を記憶させることができるということ
自動的に最後の編集を記憶する`.`とは異なり、記憶させる宣言が必要である

個人的に、丁寧に確認しつつ記憶させないと期待しない編集をすることがあるので、利用するには腰が重い
これも正式名称ではないが、マクロと呼んでいる

##### e.g.

```html:html
<div class="myclass"><p>hello world</p></div>
<!-- wの上で dat と入力すると（このコメントはマクロに関係ありません） -->
<div class="myclass"></div>
<!--  mの上で da< と入力すると（このコメントはマクロに関係ありません） -->
</div>
```

1行目の任意の位置で`qwI<!-- <Esc>A --><Esc>q`と入力すると(今回はwに保存)
※`<Esc>`はエスケープキー

```html:html
<!-- <div class="myclass"><p>hello world</p></div> -->
<!-- wの上で dat と入力すると（このコメントはマクロに関係ありません） -->
<div class="myclass"></div>
<!--  mの上で da< と入力すると（このコメントはマクロに関係ありません） -->
</div>
```

3行目5行目のそれぞれ任意の位置で`@w`と入力すると

```html:html
<!-- <div class="myclass"><p>hello world</p></div> -->
<!-- wの上で dat と入力すると（このコメントはマクロに関係ありません） -->
<!-- <div class="myclass"></div> -->
<!--  mの上で da< と入力すると（このコメントはマクロに関係ありません） -->
<!-- </div> -->
```

コメントアウトの例ばかりだったが、思いつかなかっただけなので実際には適用例は多い（はず）

### 実践例
プログラムではないが、簡易的な日中の予定兼TODOリストをファイルで管理する例
これはn倍速なのでかなり早くなっているが、操作としても9:00と3くらいしか具体的な入力はしていないでのかなり楽だった
![vim_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176375/3b6a2eb8-c385-3b93-852e-941eabdb3475.gif)
[gifじゃない元動画のリンク](https://drive.google.com/file/d/1ne-xLWryTWmGBe5KoYtwqc19Y6bR1UR8/view?usp=sharing)

- ちなみにファイルで管理する理由
    - GUIがめんどくさい
        - vimでのコピーペーストはドラッグ&ドロップよりも楽だと感じる
    - 簡易さ

### vim以外での"vim"

みんながつかっていることはいいことで、その恩恵としてvim操作を可能にする拡張が他の環境でも大抵存在している(開発してくれている方がいる)

- chrome
- jupyter notebook
- bash/zsh
- 他エディタ
などなど

## おわり
なんだかんだ基本操作の列挙してない？？？