【厳選】超初心者が初めてVimを触る時に読む記事

## 超初心者が使えるように

文字通り自分は今まで独学でプログラミングを実施したので、**Vim操作**というものに全く触れてきませんでした。

そもそも「Vim」ってなんやねん。というところから始まる初心者の方に向けてと、自分で手を動かしまくって気づいた事を書いていきたいきたい思います。

Vimをインストールしていない人は[公式サイト](https://www.vim.org/)からできますので事前にやっておきましょう。

## そもそもなぜVimなのか作られた理由を考えてみる
初心者の方は「そもそもなぜVimじゃないといけないのか？」がわからいはず。
メリットとしては、
- [x] 操作性
- [x] キーバインド（キーの実行機能）
- [x] 環境依存度が低い(Linux, Window, Macどれでも使える)
- [x] 初期設定が必要ない
- [x] ターミナルで操作可能

このくらいでしょうか？
あとは現場で**Vimしか使えない**ことがある。(自分はそんな現場知らないが聞きはする)

ということで、そもそもなんで開発されたかを考えてみよう。
ということで開発者の言葉を調べてみました。すると。。。
> エディターを用いた（プログラム）作業の大半は文字入力ではなく移動と検索であり、そこを徹底的に使い易いツールを作るべき

という考えで作られたらしい。

なるほど、、ということは移動と検索のコマンドを優先して覚えた方がVimの優位性を活かせるということですよね。

ですので、次から**初心者が覚えるべき基本操作と移動、検索コマンド**と使える便利機能について解説していきます。

あくまでもここで記載するものは**初心者が最初に覚えるべき操作**にフォーカスしております。
Vim操作はかなり種類や組み合わせが多く、最初から全部詰め込もうとするとわけわからなくなるので、まずは簡単かつ使えるものに絞って紹介させていただきます。


## 1 モードの種類と切り替え方法

Vimには**NORMAL（ノーマルモード）、INSERT(挿入モード)、VISUAL(ヴィジュアルモード)、COMMAND(コマンドモード)** の4種類があります。

今自分がどのモードで使用しているかは画面の一番左下の部分を確認しましょう。
以下、各モードの簡単な説明です。

|  モード |動作説明 |
|:--------:|:-------------|
| **NORMAL** | カーソルの移動、改行、行の挿入、検索、テキストの入れ替えや削除、コピー&ペースト、ファイルの保存... |
| **INSERT** | 文字の入力　|
| **VISUAL** | テキスト選択（部分選択、全選択) |
| **COMMAND** | ファイルの保存やVimの終了操作 |


例えば今私は操作練習のためにVim操作でこの記事を書いているのですが、これは**INSERT(挿入モード)** になります。
![Vim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/241fae6b-ff70-6ea1-8dfc-52cc9c484fbd.png)



**NORMALモードでは文字入力ができないため、コードや記事を書く際にはこのINSERTにしなければいけません。**

次はモードを切り替える方法です。
|  モード |切り替えキー |
|:--------:|:-------------|
|**NORMAL**| `esc` (エスケープ)|
|**INSERT**| `i` (小文字)|
|**VISUAL**| `v` (小文字)|
|**COMMAND**| `:`(コロン)|


初心者の方は切り替えキーを押したら必ず先ほどの画面左下を確認するようにしましょう。
というのもこのVim操作の唯一のデメリットと感じたのが、モードを間違った状態でキーを叩くと誤入力の嵐になります。


## 2 初心者が覚えるべきキー入力と動作説明

### 基本カーソル移動
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `h` | 左に移動 |
| `l` | 右に移動|
| `j` | 下に移動|
| `k` | 上に移動|

この4つは超基本の基本なので必ず覚えましょう！

### 基本カーソル移動 2(ヨコ移動)
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `w` | 次の単語の先頭に進む |
| `e` | 次の単語の末尾に進む |
| `b` | 前の単語の先頭に戻る|
| `0` | 行の先頭に移動|
| `$` | 行の末尾に移動|

### 基本カーソル移動 3(タテ移動)
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `shift + [` | 文字列を飛ばして上のスペースに移動|
| `shift + ]` | 文字列を飛ばして下のスペースに移動|
| `ctrl + u` | 半分上に移動|
| `ctrl + d` | 半分下に移動|
| `ctrl + f` | 画面1つ上に移動|
| `ctrl + b` | 画面1つ下に移動|
| `gg` | ページ最上部に移動|
| `G` | ページ最下部に移動|
| `数字G` | 入力した数字の行に移動|


**基本カーソル移動1→2→3となるにつれて動作が大きくなる**ように紹介しました。
特に3が分かりづらいと思いますので、少し解説します。

まずは`shift + [`と`shift + ]`はこんな感じです。
![vim記事.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/fd521f0c-0fd2-c1d3-674a-d78eef2ea53e.png)

説明の通りですが文字列を固まりとしてすっ飛ばしてくれます。メチャ最高。

次は`ctrl + u`と`ctrl + d`
これは**up**と**down**と覚えましょう。非常に単純です。
![vimctrlu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/5a817cb3-98e3-4bc9-97d0-239f0802e2ac.png)

次は`ctrl + f`と`ctrl + b`
これは**forward**と**back**で、大きく前と後ろに進むイメージ。
![vim forwardback.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/25db59bd-9a56-20a1-f7a0-502310100d91.png)


### 基本カーソル移動 4
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `H` | 表示されている画面の一番上に移動|
| `M` | 表示されている画面の真ん中に移動|
| `L` | 表示されている画面の一番下に移動|

それぞれ**High**, **Middle**, **Low**と覚えればいいですね！


### 文字入力操作
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `i` | 文字入力開始(挿入モード切替)|
| `a` | 次の文字から入力開始|
| `o` | 改行して文字入力開始|
| `r` | 1文字だけ文字を置き換え（上書きに近い感じ）|
| `I` | 行の頭から文字入力開始|
| `A` | 行の最後から文字入力開始|
| `O` | 上の行に行を挿入して文字入力開始|
| `R` | 置き換え（何文字でも）|
| `gi`| 最後に文字入力された位置から入力開始|

iは**insert**、aは**append**のa、oは**open line**、rは**replace**という意味ですね。
giはわかりません（笑）

ここで一つ前のH,M,Lと同様に**大文字**キーが出てきました。
これは自分もやりながら途中で気づいたのですが、大文字は**小文字の時の動作の逆の動き、もしくは大きな動き**になっていることがほとんどなんですよね。


次は削除系の紹介ですが、その前にVimの**オペレーターとモーション**について説明します。

オペレーターは**最初に叩くキーで動作の種類を意味し、モーションは次に叩くキーで動作の範囲を意味します**。つまり2回キーを叩くということです。 **「どんな動きを(1回目)どのくらい(2回目)」** とイメージするといいでしょう。


### オペレーターの種類
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `c` |変更する(change)|
| `d` |消す(delete)|
| `y`  |コピーする(yank) |

ではこれを意識して次の削除系コマンドをみていきましょう！

### 削除系操作
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `ce` | 単語の末尾まで変更(単語を削除した後に挿入モード)|
| `cc` | 行全体を変更(行全体を削除後に挿入モード)|
| `dd` | 行全体を削除|
| `d$` | カーソル位置から後ろの行を削除|
| `dw` | 次の単語まで削除(delete word)|
| `x`  | カーソル下の文字削除|
| `C` | カーソル位置から行の最後までを削除して文字入力開始|
| `D` | 上の行に行を挿入して文字入力開始|
| `X` | 最後に文字入力された位置から入力開始|


### 選択&コピー&貼り付け操作
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `v + h or l` | 左右の範囲選択|
| `v + k or j` | 上下の範囲選択|
| `shift + v` |行全体を選択|
| `shift + g` |ページ先頭にカーソルがある状態で叩くと全選択|
| `yy` | 行全体をコピー(選択部分のコピーはyを1回だけでコピー可能)|
| `cc` | 行全体を変更(行全体を削除後に挿入モード)|
| `dd` | 行全体を削除|
| `d$` | カーソル位置から後ろの行を削除|
| `Y` | 行全体をコピー(yyと同じ動作)|


例えば広いエリアを選択したい時は
![vim選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/d51522ad-a389-a0c8-7e77-798144f6c2a9.png)
![vim選択2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/da61d251-0b50-203c-4c06-93e22118ed1a.png)

### 検索操作
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `/ + 検索ワード` |カーソル位置から終わりに向かって検索|
| `? + 検索ワード` |カーソル位置から始めに向かって検索|
| `*` |カーソル位置にあるワードをページ内から検索次の出現箇所に移動|
| `#` |カーソル位置にあるワードをページ内から検索して直前の出現箇所に移動|
| `%` |対になる括弧やカンマ系を見つけて移動|

こちら解説していきます。
まずNORMALモードで 「**/**」 を叩くと画面左下に入力できるようになります。

![検索2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/9cc476e7-c17f-01fa-e82b-be576a10a05a.png)



**「?」** 検索はこの逆方向に検索してくれます。

そして、個人的にメチャ便利だと思ってるのが「*」アスタリスク検索。
説明の通りですがこんな感じ。
![Vim検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/c4fce4f5-bd12-614d-baaa-840f8166bdf4.png)



**「#」は逆方向に検索して直前の出現箇所に移動してくれます。**
ちなみに`n`で前に移動、`N`で後ろに検索ワードを移動できます。


続いてこれも間違いが多い初心者には欠かせない取り消し操作。
この記事を書いてる時にも何回使用したことか（笑）

### 取り消し操作
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `u` | 直前操作取り消し|
| `U` | 行全体の操作を取り消し|
| `ctrl + R` | 取り消しの取り消し(つまり`u`で取り消した操作を復旧できる)|


最後に忘れてはならい保存操作です。
### 保存&終了系&他便利操作
|  コマンド操作 |動作説明 |
|:--------:|:-------------|
| `:w` |上書き保存|
| `:q` | 保存せずに終了|
| `:wq`|ファイルの保存をしてから終了|
| `:set number` |行頭に番号つける|
| `:set nonumber` |行頭番号解除|

`:set number`で行番号がわかれば「基本カーソル移動3タテ移動」で紹介した`数字 + G`に使えますね。

## 終わりに
いかがでしたか？
この記事も結局Vimで全部ストレスなく書き終えてしまったので、慣れれば誰でも書けるようになります:writing_hand:

毎日とは言わずとも、ちょこちょこ触って操作を忘れないようにしましょう。