Vimの基本操作について

## はじめに
今回はVimの基本操作について学習したので、自分なりに
分かりやすくまとめていきたいと思います。

## Vimとは
Linux環境で人気のあるテキストエディタです。
vimとnvimがありますがnvimで使えるものは基本的にvimでも使えるという認識で良いかと思います。


## vimのモードについて

- INSERTモード 
- NORMALモード
- :(コマンド）モード
- VISUALモード

vimには上記の4つのモードがあります。

### モードの説明
#### INSERTモード 
ファイルの編集ができる
#### NORMALモード 
vim立ち上げ時のデフォルトで移動やコピーなどの様々な操作をすることができる
#### :(コマンド）モード 
コマンドを実行したい時に使うことができる
保存や終了ができる
#### VISUALモード 
範囲選択をするときに使うことができる
コピペや削除などで利用する


### モードの切り替え操作
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>i</td> <td>INSERTモード</td>
  </tr>
  <tr>
    <td>esc</td> <td>NORMALモード</td>
  </tr>
  <tr>
    <td>:</td> <td>コマンドモード</td>
  </tr>
  <tr>
    <td>v</td> <td>VISUALモード
</td>
  </tr>
</table>



## コマンド操作について

### 移動操作
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>k</td> <td>上↑に移動</td>
  </tr>
  <tr>
    <td>j</td> <td>下↓移動</td>
  </tr>
  <tr>
    <td>h</td> <td>左←に移動</td>
  </tr>
  <tr>
    <td>l</td> <td>右→に移動</td>
  </tr>
</table>

### 起動・保存・終了

<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>vim</td> <td>起動</td>
  </tr>
  <tr>
    <td>:w</td> <td>上書き保存</td>
  </tr>
  <tr>
    <td>:w ファイル名</td> <td>名前をつけて保存</td>
  </tr>
  <tr>
    <td>:q</td> <td>編集終了</td>
  </tr>
　<tr>
    <td>:q!</td> <td>保存しないで編集終了</td>
  </tr>
　<tr>
    <td>:wq</td> <td>保存して編集終了</td>
  </tr>
</table>

### 削除

<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>x</td> <td>1文字削除</td>
  </tr>
  <tr>
    <td>dd</td> <td>1行削除（コピー可能）</td>
  </tr>
  <tr>
    <td>dw</td> <td>単語の削除</td>
  </tr>
  <tr>
    <td>2 dd</td> <td>2行削除</td>
  </tr>
  <tr>
    <td>u</td> <td>Undo（control + z と同じ役割）</td>
  </tr>
  <tr>
    <td>control + r</td> <td>Undo redo（control + shift +z と同じ役割）</td>
  </tr>
</table>

:::note 
2ddの数字の部分は数を指定した行数を削除できる
:::


### コピー・ペースト

<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>y</td> <td>選択範囲のコピー</td>
  </tr>
  <tr>
    <td>yy</td> <td>一行コピー</td>
  </tr>
  <tr>
    <td>p</td> <td>下にペースト</td>
  </tr>
  <tr>
    <td>P</td> <td>現在行にペースト</td>
  </tr>
  <tr>
    <td>2yy</td> <td>2行コピー</td>
  </tr>
  <tr>
    <td>.</td> <td>直前の操作のリピート</td>
  </tr>
</table>


:::note 
2yyの数字の部分は数を指定した行数をコピーできる
:::

:::note 
`y`はVISUALモードで範囲を指定してからコピーする
:::


## コマンドの実行
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>：</td> <td>コマンドモード</td>
  </tr>
  <tr>
    <td>!ls</td> <td>lsコマンドの実行</td>
  </tr>
  <tr>
    <td>!!</td> <td>前のコマンドを実行</td>
  </tr>
</table>

:::note 
!lsは[!コマンド]なのでコマンドの部分を変更できる
:::

## 応用的な移動操作


<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>:set number</td> <td>行番号を表示する</td>
  </tr>
  <tr>
    <td>:10</td> <td>10行目に移動</td>
  </tr>
  <tr>
    <td>$</td> <td>行末に移動</td>
  </tr>
  <tr>
    <td>0</td> <td>先頭に移動</td>
  </tr>
  <tr>
    <td>^</td> <td>インデントの先頭に移動</td>
  </tr>
  <tr>
    <td>{</td> <td>段落ごとに上に移動</td>
  </tr>
  <tr>
    <td>}</td> <td>段落ごとに下に移動</td>
  </tr>
  <tr>
    <td>[[</td> <td>セクションごとに上に移動</td>
  </tr>
  <tr>
    <td>]]</td> <td>セクションごとに下に移動</td>
  </tr>
  <tr>
    <td>:1 or gg</td> <td>ファイルの先頭に移動</td>
  </tr>
  <tr>
    <td>G</td> <td>ファイルの最後に移動</td>
  </tr>
  <tr>
    <td>Control + o</td> <td>移動前の位置に戻る</td>
  </tr>
</table>

:::note 
:10の数字は指定したい数字に変更する
:::

## 検索・置換
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>/test</td> <td>「test」の検索</td>
  </tr>
  <tr>
    <td>n</td> <td>次の検索結果に移動</td>
  </tr>
  <tr>
    <td>N</td> <td>前の検索結果に移動</td>
  </tr>
  <tr>
    <td>R</td> <td>置換</td>
  </tr>
  <tr>
    <td>dw</td> <td>単語削除</td>
  </tr>
  <tr>
    <td>:%s/good/bad/g</td> <td>「good」から「bad」に一括置換</td>
  </tr>
  <tr>
    <td>:%s/good/bad/gc</td> <td>good」から「bad」に確認しながら置換</td>
  </tr>
</table>

:::note 
検索は`/検索したい文字`で検索
:::

:::note 
`n`や`N`は検索した後に使用可能
:::

:::note 
一括置換や確認置換をする際は　　
`:%s/検索文字列/置換後の文字列/g`
`:%s/検索文字列/置換後の文字列/gc`
で記入する
:::

## INSERTモードへの切り替え
基本的なINSERTモードへの切り替えは`i`で行えるのですが、そのほかにもINSERTモードへ切り替える方法があります。

<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>a</td> <td>カーソルの次の文字からINSERTモード</td>
  </tr>
  <tr>
    <td>o</td> <td>選択行の下に空白を入れて、INSERTモード</td>
  </tr>
  <tr>
    <td>O</td> <td>選択行に空白を入れて、INSERTモード</td>
  </tr>
</table>

:::note 
`i`はカーソルの前の文字からINSWRTモード
:::



## 連結・インデントの移動
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>J</td> <td>行の連結</td>
  </tr>
  <tr>
    <td>></td> <td>右にインデントを移動</td>
  </tr>
  <tr>
    <td><</td> <td>左にインデントを移動</td>
  </tr>
</table>

## VISUALモード

<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>動き</th>
    </tr>
  </thead>
  <tr>
    <td>v</td> <td>VISUALモード</td>
  </tr>
  <tr>
    <td>V</td> <td>VISUAL LINE（行の選択）</td>
  </tr>
</table>

:::note 
`v`で選択したい部分の先頭にカーソルを合わせてからVISUALモードに切り替えたら`k`、 `j`、 `h`、 `l`を使って移動すると移動後までの選択ができる
:::

:::note 
`V`で選択したい行の先頭にカーソルを合わせてからVISUALモードに切り替えたら`k`、 `j`を使って移動すると移動後までの選択ができる
:::


## 最後に
今回はVimの基本的な操作についてまとめてみました。
Vimには全部で約2000コマンドもあるらしいです💦
全て暗記することは厳しいので基礎的なものから
実際にVimを動かして体で覚えるのがよいと思うのでたくさん使って慣れていきたいところです。


最後までご覧いただきありがとうございました。


## 参考文献

[現役シリコンバレーエンジニアが教える NeoVim(VIM) + Tmux + Zsh 入門-Udemy](https://www.udemy.com/course-dashboard-redirect/?course_id=4225254)

https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d


https://qiita.com/Hiyajo/items/9f87c5687652da42f275