初心者が教える初心者のためのVim

## はじめに
今回はVim初心者の目線で「使ったことないよ〜」って方に向けて書きました。私が学んだ中で実際に使えるなと思った機能を書いています。少しでも皆さんの勉強の足しになれれば幸いです。　

## 1. Vimとは
コンソール上で動くテキストエディタのこと
今は高機能なエディタが多く存在しているがVimにはVimの良さがあるため簡単にまとめてみた
- 4つモードがあり操作性・機能性の幅が広い
- プラグインによる機能の拡張
- ヘルプの充実


## 2. Vimを始めよう

#### Vimの起動する
Vimを起動するには
```
vim ファイル名 <ENRER>
```

#### Vimを終了する
```
・変更を保存する場合
<esc>:wq <enter>
・変更を破棄する場合
<esc>:q!
```

## 3. Vimの４つのモード
Vimには以下の４つのモードがある
|モード|代表的な機能|起動の仕方｜
|:----:|:----------:|:----------|
|Normalモード|カーソル移動、コピー(ヤンク）、ペースト(プット)、削除など|`ecc`
|Insertモード|入力、貼り付け、入力補完、単語削除|`a` `i` `A` `I` `ciw`|
|commandモード|保存、終了、文字列置換|`:`|
| Visualモード|範囲選択、コピー、削除、フィルター|`v`|

### Normalモード
Vimを起動した時の状態であり全ての中心のモード
各モードへ移動するにはここを経由する

#### Normalモードでできること 
コマンドは３つの要素から構成されている
- モーション
- オペレータ
- テキストオブジェクト


**モーション**
  カーソル移動のこと

|モーション|説明|
|:--------:|:--:|
|`h` `←`|カーソルを左にずらす|
|`j` `↓`|カーソルを下に下げる |
|`k` `↑`| カーソルを上に上げる|
|`l` `→`| カーソルを右にずらす|
|`H`|表示されている画面の一番上に行く|
|`M`|表示されている画面の真ん中に行く|
|`L`|表示されている画面の一番下に行く|
|`0`(ゼロ)|行頭に移動（空白文字も含む）
|`^`(10行目なら:10)|n行目|
|`$`|行末に移動|
|`g_`|行末の非空白文字に移動|
|`G`|ファイル最後尾に移動|
|`gg`|ファイル先頭に移動|
|`w`|カーソル位置から空白を含む単語の末尾まで|
|`e`|カーソル位置から空白を含まない単語の末尾まで
|`%`|「{」や「”」など、テキストを囲む記号の上で叩くとその反対の閉じ記号に移動する|
|`f`|`f`+ {文字}を叩くとカーソル行にある一番始めの{文字}まで移動|

**オペレーター**
`y`や`d`などの削除や変更などのファイルの編集動作を指定するためのコマンド。モーションコマンドを組み合わせて使うことができる

|オペレーター|操作|
|:----------:|:--:|
|`y`|ヤンク|
|`x`|削除|
|`d`|削除|
|`c`|変更|
|`v`|選択|
|`r`|置換|
|`~`|大文字/小文字入れ替え|
|`gU`|大文字にする|
|`gu`|小文字にする|

**テキストオブジェクト**
オペレータと組み合わせてテキストオブジェクト単位での編集ができる

```
オペレータコマンド + (回数指定) + 内部/外部指定 + テキストオブジェクトの種類の指定
```

### Insertモード
文字を挿入するためのモード
このモードにいる間は各キーは文字入力として扱われる

#### Insertモードでできること

|コマンド|操作｜
|:------:|:---:|
|`i`|ノーマルモードにてカーソル位置にテキストを挿入する|
|`a`|ノーマルモードにて行末にテキストを追加する|
|`A`|行末に移動して挿入モード|
|`o`|行の下に新しい行を作成して挿入モード|
|`O`|上に新しい行を作成し挿入モード|


:::note
**`i`** と **`a`** の違い：カーソルの場所から1文字進めるか進めないか
:::

### commandモード
ファイルの保存、vimの終了などいろいろな操作を行うためのモード

#### commandモードでできること
変更の保存、Vimの終了、置換、検索などを行うことができる
|コマンド|操作｜
|:------:|:---|
|`:w`|ファイルの保存(ファイルがなければ新規作成される)|
|`:wq`|保存して終了|
|`:q`|Vimを終了|
|`q!`|強制的に終了する|

### Visualモード
範囲選択、コピー、削除、フィルターなど

#### Visualモードでできること
範囲選択もモーションの一つでオペレーターを組み合わせることができる。選択した範囲に対して削除、ヤンクを行うことができる。
|コマンド|操作|
|:------:|:--:|
|`v`|文字単位の範囲選択|
|`V`|行単位の範囲選択|
|`c`|VisualModeで選択した範囲を消してInsertModeで終わる|

## 4. 外部コマンドの実行
選択した範囲のテキストを外部コマンドの標準入力に渡すことができる。ソースコードの一部だけ整形したいときに便利。
**` :!`** の後に実行する外部コマンドをタイプ
**`:!ls + enter`**:ディレクトリの一覧が表示される

## 5. 検索コマンド
#### 対応する文字の検索
語句を検索するには `/` と、前方検索する語句をタイプ
`n` : 同じ語句をもう一度検索するとき
 `N` : 逆方向に語句を検索するとき 
逆方向に語句を検索する場合は、`/` の代わりに `?` コマンドを使用

#### 対応する括弧を検索
 (,[ か { のどれかにカーソルを移動する
 `%` とタイプするとカーソルは対応する括弧に移動する

#### 間違いを変更する方法
old を new に置換するには **:s/old/new/g** とタイプ

#### 複数行から見つかる文字の全ての箇所を変更する
**:#,#s/old/new/g**#,# には置き換える範囲の開始と終了の行番号を指定する
**:%s/old/new/g**      ファイル全体で見つかるものに対して変更する
**:%s/old/new/gc**     ファイル全体で見つかるものに対して、1つ1つ確認をとりなら変更する



## 6. 便利コマンド

|コマンド|説明|
|:------:|:--:|
|`u`|操作を1つ戻す
|`U`|行全体の取り消し|
|`Ctrl-u`|画面半分上にスクロール|
|`Ctrl-d`|画面半分下にスクロール|
|`Control+b`|約１画面分移動する|
|`Control+f`|約１画面分下に移動する|


## 7. プラグイン
プラグインとは簡単にいえば「拡張機能」のこと。
素のVimでも充分便利だが、やはりできることに限界があるためプラグインを使うことで標準にはない機能を追加でき、Vimでの作業が時短になる

## 8. ヘルプ機能
Vimにはヘルプ機能がとても充実している
とても長くなるため今回内容は省略
わかりやすい記事があったため参考にしてみてください 

https://qiita.com/from_kyushu/items/b3cb5c721b2ab5e029c4



## 9. おわりに
　Vimには本当に多くの機能があり今回紹介したのは一部です。初めて操作した時は、多くのコマンドに圧倒され、覚えるには実際に手を動かしてみないと難しいなと感じました。この記事は今後私自身が学びながら内容を更新していく予定です。知識不足で間違いがありましたら、ご指導いただきたいです。最後まで読んでいただきありがとうございました。