vimの基本操作について

## はじめに

### vimとは
お疲れ様です！プログラミング学習者がおそらく通るであろう道、Vim。
覚えて使いこなせるようになると作業効率が上がるそうです。
VimとはCUI(キーボードのみ)で操作するテキストエディタです。

https://ja.wikipedia.org/wiki/Vim


内容はおそらく基本のキも行かないですが、すぐに理解して使いこなせるものをまとめました。

### 導入

Macには最初からvimが入っていますが、最新版が良いので。

https://original-game.com/vim-mac/

Windowsのやり方はこちら。

https://qiita.com/hikaruright/items/b415d569b5bbeaf967bd

## 基本

### Mode
1. `Insert mode`
   * ファイルに入力できるモード
   * iで移行
   * 画面下に --INSERT--の文字
![Screenshot 2023-07-12 at 21.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/8a588a87-aa55-c15f-7cd7-211409856c23.png)
   

1. `Normal mode`
   * 何を打っても入力されない。編集が可能なモード
   * Insert mode から Esc で Normal modeになる
   * 画面下には無字

1. `View mode`
   * 起動時 vim file_nameではなく、view file_nameで開く
   * RO fileとして起動する
   * ~/.zshrc のような書き換えたら問題になる時に使う


4. `Command mode`
   * :!command   コマンドを実行。vimを抜ける必要がないため作業効率が上がる
   * :!! 前のコマンドを実行
   * Normal modeの際記述可能
5. `Visual mode`
   * カーソル指定が可能
   * Normal modeからvで移行
![Screenshot 2023-07-12 at 21.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/258dc8fa-2bd1-bed1-ab58-f69b14f8855e.png)


### カーソル移動

| コマンド | 説明 | |コマンド | 説明 |
|:-:|:-:|:-:|:-:|:-:|
|  h |  ←移動 ||  $ |  行末へ移動 |
|  j |  ↓移動 ||  0 |  行頭へ移動 |
|  k |  ↑移動 ||  gg or :1 |  ファイルの先頭に移動 |
|  l |  →移動 ||  ctrl + o |  移動前に戻る |
|  :set number |  行番号を表示 ||  G |  ファイルの最後に移動 |
|  :10 |  10行目を表示 ||:set nonu|行番号非表示|



### 削除系の編集(Normal mode)

| コマンド | 説明 |
|:-:|:-:|
|  x |  一文字削除 |
|  dd |  一行削除 |
|  u |  undo |
|  Ctrl + r |  undo redo |
|:%d| 全文削除|
|dw|単語の削除|

`入力`
![Screenshot 2023-07-12 at 20.57.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/7a7d1b28-40e4-e308-fe61-b258b27a8d7a.png)

カーソルがwの箇所にあるとする。ここからx,X,dwの出力結果を記す。

`出力:x`
![Screenshot 2023-07-12 at 20.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/892cbea6-6397-7a50-e88f-ee979f4dad86.png)

:::note warn
カーソルにある文字が削除される。
:::

`出力：X`
![Screenshot 2023-07-12 at 21.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/b8bc82c2-4d29-c5cc-a877-95b572574c64.png)

:::note warn
カーソルの前の文字が削除される
:::


`出力：dw`
![Screenshot 2023-07-12 at 21.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/1cc0c6f3-5218-e397-65e2-3e8de23a30c3.png)

:::note warn
カーソルの単語が削除される
ただし、単語の途中だった場合カーソル以降が削除される
:::


### コピー＆ペースト(Normal mode)

| コマンド | 説明 |
|:-:|:-:|
|  **yy** |  一行コピー |
|  **p** |  下にペースト |
|  P | 現在行にペースト  |
|  . | Repeat  |


　　. (Repeat)　は前におこなったコマンドを再度行うというコマンド
どのコマンドでも適用される




### 検索と置換

|コマンド|説明|
|:-:|:-:|
|/調べたい文字|検索|
|:%s/変えたい文字/書き換えたい文字/g|一括置換|
|:%s/変えたい文字/書き換えたい文字/gc|確認しながら一括置換|

### Visualモードやインデント

|コマンド|説明|
|:-:|:-:|
| **o** |選択行の下に空白を入れて入力|
| O |選択行に空白を入れて入力|
| **v** |visual mode|
|h,j,k,l|visual modeで選択|
|>|右にインデントを移動|
|<|左ににインデントを移動|

* visual modeではカーソル指定ができる。故に任意の単語、文をコピー、削除が可能である。


 `入力`
![Screenshot 2023-07-12 at 21.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/9a6f9fea-13a8-86b8-14d6-40d925ee3241.png)

132行目にカーソルがあるとする。

`oの出力`
![Screenshot 2023-07-12 at 21.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/cb3f4fda-9d69-8e8f-ceee-9d4e590eaeba.png)

:::note warn
カーソルの下に空白行を入れて入力モードになる
:::

`Oの出力`
![Screenshot 2023-07-12 at 21.26.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/2766fb53-e7ea-7e92-b6a6-af82e998544c.png)

:::note warn
選択行に空白行を入れて入力モードになる
:::
ややこしい....

* `oとO`, `xとX`, `pとP`に関してはどちらの意味を持っているか紛らわしく感じる。人によっては片方のみを覚えて使っているようだ。


### 覚えていると...
| コマンド | 説明 |
|:-:|:-:|
|  **e** |  単語の末尾まで移動 |
|  **w** |  単語の先頭まで移動 |
|  **b** |  前の単語の先頭へ移動 |

* これについては[vim adventures](https://vim-adventures.com/)のLevel3で学習したのだが、覚えていると移動が圧倒的に早くなると感じた。特に文章を扱う場合に。

### 保存
| コマンド | 説明 |
|:-:|:-:|
|:wq|保存して終了|
|:q!|保存せず強制終了|
|:wq!|保存して強制終了|

## 終わりに
一通りVimについて学習して、覚えてしまえば大変便利なコマンドばかりですね！Vimmerの方々の気持ちがすごく理解できました

今回紹介したコマンドは一部の超基本コマンドであって、vimのコマンドは2000を超えるそうです。たくさんありますので興味があれば！！
皆さんで作業効率を上げましょう！

## 参考

https://www.udemy.com/course/vim-tmux-zsh/learn/lecture/27876316#questions

https://vim-adventures.com/