Vimの使い方解説:自分なりにわかりやすくまとめてみる。インストール〜使用まで

# はじめに  
最近縁があって、Vimを使い始めました。それまでは複雑だからと敬遠していたんですが、いざ使ってみると面白くて、やばいです。（語彙）  
色々と調べながらやっていたのですが、いくつかのページを渡り歩くのがめんどくさかったので、初心者なりに備忘録的にここにまとめてみようかと。  

読者の方、端から端まで書いてるので、不要なら適宜飛ばしてください。また、僕はMac持ってないので、Macに関しての言及はありません。LinuxとWindowsだけです。まあ、インストールしたらMacでもほぼ同じだけどね。  
なお、僕の環境は
- Windows11 21H2
- Linux Debian11 Bullseye
  
れっつごー。  

# Vimとは  
UNIX系OSなどで主に使われているテキストエディタ。全身のviができた頃はマウスはあまり普及していなかったため、すべての操作がキーボードで可能。だから癖があるけど慣れるとめちゃ速くなる。

# メリットとデメリット  
## メリット
- Linuxなどに標準で入っている
- 慣れるとオニ早い
- コンソールで動く
- 軽い。とにかく軽い。
- かっこいい。←ここ重要
## デメリット
- Windowsなどにはインストールが必要（面倒ではない）
- 慣れないとオニ遅い
- 慣れてしまうとほかのエディタを使えなくなる（この記事はQiitaのブラウザエディタで書いてるんですが、マウス操作がめんどくさくなったのと、アローキーでの移動がじれったいです笑）←ちょっと大げさ

# インストール
## Linux
不要。
## Windows
1. [Vimの公式サイトのDownloadページ](https://www.vim.org/download.php#pc)から該当パッケージをダウンロードし、インストーラーに従ってセットアップ。  
(2022.10現在、DLリンクが２つありますが、多分どっちでも大丈夫です。説明書きを読んで、選んでください。わかんなければ多分上のほうで十分。)  
1. 環境変数にVimをインストールしたディレクトリのPATHを追加。

# 起動
## Linux
コマンドプロンプトに``` vi ```もしくは``` vim ```と入力。オプションで開くファイルのパスを指定。
## Windows
コマンドプロンプトに``` vim ```と入力(コンソール版が開きます。オプションで開くファイルを指定)、またはスタートメニューからgVimを起動。(GUI版のVimが開きます。)  
エクスプローラーでファイルを右クリックしたときのコンテクストメニューにも"Vimで開く"とある場合がある(インストール時の設定による)

:::note info
- gVim:通常起動のgVim
- gVim Read Only:読み取り専用。プロンプトからは、``` -R ```オプションで可能。
- gVim Easy:普通のテキストエディタと同じような使い勝手。せっかくVim使ってるんだから、これはあんま意味ないよね、と個人的には思います。
:::

:::note info
 **コンソール版とgVimの違い**  
コンソール版は当然ですがマウスは使えません。（例外あり）あと、Windowsだと色表現が乏しい。  
gVimはGUI上で動いているため色表現が豊かにできて、かつマウスで細かい操作が可能です。  
僕はコンソール版のが好き。なぜならシンプルだから。
:::

# 使い方(この記事の命)  
Vimにはモードがあります。それぞれのモードでできることが決まっていて、それを行き来しながら編集します。  
下に各モードと、そのモードの英語表示を書きます。これらは画面の左下に書かれています。
- ノーマルモード:(非表示)  
- ビジュアルモード  
    - ビジュアル:VISUAL
    - ビジュアル 行:VISUAL LINE  
    - ビジュアル 矩形:VISUAL BLOCK
- セレクト
    - セレクト:SELECT
    - 行指向選択:SELECT LINE  
    - 矩形選択:SELECT BLOCK
- 挿入:INSERT
    - 挿入ノーマル:(insert)
    - (挿入)ビジュアル:(insert)VISUAL
    - (挿入)ビジュアル 行:(insert)VISUAL LINE
    - (挿入)ビジュアル 矩形:(insert)VISUAL BLOCK
- 置換:REPLACE
- コマンドライン:(入力したコマンドが表示)
    - 前方検索:(入力したコマンドが表示)
    - 後方検索:(入力したコマンドが表示)

各モードの機能とコマンドを書いていきます。各モードの最初に書いた"\>\>"の後ろには、このモードへの移動方法を書いてあります。

## ノーマルモード
\>\> ```Esc```
\>\> Ctrl+```[```
\>\> Ctrl+```c```
Vimを起動したときはこれになります。他のモードからEscを二回以上押せば確実にこのモードになります。
移動や文字の削除などをするモードです。  
### 移動系
繰り返し可能なものは、コマンドの先頭に数字をつけることでその回数繰り返されます。
ex) ```3h```...3文字左
| コマンド | 動作 | | コマンド | 動作 | | コマンド | 動作 | | コマンド | 動作 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| ```h``` | ← || ```j``` | ↓ || ```k``` | ↑ || ```l``` | → |
| ```0``` | 行頭 || ```$``` | 行末 || ```^``` | 行の文字開始位置 |
| ```e``` | 語頭 || ```b``` |前語頭 || ```w``` | 次語頭 |
| ```gg``` | 先頭行 || ```G``` | 最終行 || ```%``` | 対応する括弧 |
| Ctrl+```f``` | 1ページ下 || Ctrl+```b``` | 1ページ上 || Ctrl+```d``` | 半ページ下 || Ctrl+```u``` | 半ページ上 |
| ```H``` | 画面先頭 || ```M``` | 画面中央 || ```L``` | 画面下端 |

### 削除系
繰り返し可能なものは、コマンドの先頭に数字をつけることでその回数繰り返されます。
ex) 3dd...3行削除
| コマンド | 動作 || コマンド | 動作 || コマンド | 動作 || コマンド | 動作 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| ```x``` | delete || ```X``` | backspace || ```dd``` | 行 || ```d```(```h```,```j```,```k```,```l```<br>のいずれか) | 指定方向 |
| ```D``` | 行のカーソル以降 || ```dw``` | 1語 || ```de``` | 空白まで |
| ```d^``` | 行頭まで || ```d$``` | 行末まで || ```df``` 文字列 | 文字列まで |

### その他
繰り返し可能なものは、コマンドの先頭に数字をつけることでその回数繰り返されます。
ex) 3yy...3文字ヤンク
| コマンド | 動作 || コマンド | 動作 || コマンド | 動作 || コマンド | 動作 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| ```~``` | 大文字小文字変換 || ```J``` | 下行と結合 |
| ```yy``` | ヤンク<br>(コピー) || ```yw``` | 1語ヤンク || ```yl``` | 1行ヤンク || ```y0``` | 行頭までヤンク |
| ```y$``` | 行末までヤンク || ```daw``` | 1語カット || ```p``` | カーソル後にペースト || ```P``` | カーソル上にペースト |
| ```r``` | 文字置換 || ```>>``` | インデントを付ける || ```<<``` | インデントを消す || ```*``` | 現在単語を検索 |

## ビジュアルモード
ビジュアルモードには上述のように3種類(挿入ビジュアル含めると6種類)あります。
- **ビジュアル(一文字単位)**
ノーマルから \>\> ```v```
挿入から \>\> Ctrl+```o``` ```v``` ((挿入)ビジュアル　になります)
- **ビジュアル 行(行単位)**
ノーマルから \>\> ```V```
挿入から \>\> Ctrl+```o``` ```V``` ((挿入)ビジュアル 行　になります)
- **ビジュアル 矩形(矩形選択)**
ノーマルから \>\> Ctrl+```v```
挿入から \>\> Ctrl+```o``` Ctrl+```V``` ((挿入)ビジュアル 矩形　　になります)
- **その他**
    - 前回と同じ範囲を選択: \>\> ```gv```

範囲を選択して、その範囲に対してアクションをするモードです。選択範囲の動かし方は、ノーマルモードのカーソル移動と同じ要領だから省略。

### アクション
| コマンド | 動作 || コマンド | 動作 || コマンド | 動作 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| ```x``` | 削除 || ```d``` | カット || ```y``` | ヤンク |
| ```gu``` | 小文字化 || ```gU``` | 大文字化 |
| ```>``` | インデントを付ける || ```<``` | インデントを消す || ```=``` | オートインデント |

## セレクト
上述のように、セレクトにも3つあります。
- **セレクト** 
 \>\> ```gh```
- **行指向選択**
 \>\> ```gH```
- **矩形選択**
 \>\> ```g``` Ctrl+```h```

ノーマルから \>\> Ctrl+```g```  
挿入から \>\> (マウスドラッグ または Shift+カーソルキー)  

GUIでの選択に似た選択モードです。  
文字入力で置換、backspaceで削除になります。

## 挿入
カーソル前から \>\> ```i```  
行頭から \>\> ```I```  
カーソル後から \>\> ```a```  
行末から \>\> ```A```  
単語末から \>\> ```ea```  
下に空行を作ってから \>\> ```o```  
上に空行を作ってから \>\> ```O```  
現在クオートの中を消してから \>\> ```ci"```  
(↑```"```を```'```に書き換えてシングルクオートに、```w```に書き換えて単語、```t```でHTMLタグも使用可)  

| コマンド | 動作 || コマンド | 動作 || コマンド | 動作 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| Ctrl+```p``` | 前方検索して補完 || Ctrl+```n``` | 後方検索して補完 || Ctrl+```y``` | 補完確定 |

### 挿入ノーマル
挿入 \>\> Ctrl+```o```  
挿入で一回だけノーマルのコマンドを実行できます。

## 置換
\>\> ```R```  
文字を入力するごとに一文字ずつ置換されて進んでいきます。  

## コマンドライン
コマンド \>\> ```:```  
前方検索(正規表現) \>\> ```/```  
後方検索(正規表現) \>\> ```?```   

メタでコアな命令ができます。ノーマルモードでいきなり入力します。  
いずれも最後に```!```をつけることで強制実行されます。  
行番号は、```$```を使うと最終行と指定が可能です。  

```Vim
" 閉じる
:q
" 保存
:w
" 保存して終了
:wq

" カーソル行の最初のstr1をstr2に置換
:s/str1/str2
" 行全体で置換
:s/str1/str2/g
" 指定した行範囲の最初のstr1をstr2に置換
:s開始行番号,終了行番号/str1/str2
" 指定した行範囲のすべてのstr1をstr2に置換
:s開始行番号,終了行番号/str1/str2/g
" 指定行の最初のstr1をstr2に置換
:s行番号/str1/str2
" 指定行のすべてのstr1をstr2に置換
:s行番号/str1/str2/g
" 全体の最初のstr1をstr2に置換
:%s/str1/str2
" 全体のstr1をstr2に置換
:%s/str1/str2/g
" 指定行へジャンプ
:行番号
" 行削除
:d
" strのある行を削除
:g/str/d
" 指定行を削除
:行番号d
" 指定行範囲を削除
:開始行番号,終了行番号d
" カーソル以降全削除(上の応用)
:.,$d
" リロード
:e
" 下行にファイルを挿入
:r ファイルパス
" コマンドの実行結果を挿入
:r! シェルコマンド
" 外部コマンドでフィルタ
:!コマンド
" swapファイルの読み込み
:recover 該当の編集ファイル
" 検索などによるハイライトを消す
:noh

" 画面分割
" 上下
:sp ファイル名
" 左右
:vs ファイル名
" Ctrl+W h/j/k/l で編集するウィンドウを切り替えます。閉じるときは通常通り :q です。

" 前方検索
/正規表現
"後方検索
?正規表現

" その他設定(これはホームディレクトリの.vimrcファイルに":"を抜いて書き込んでおくと常時有効になります。)
" 2つ目の値の前にnoをつけると無効になります。 ex):set nonu...行番号非表示
" 行番号の表示
:set nu
" 自動インデント(改行後のインデントの継続)
:set autoindent
" 自動インデント(改行前の文字に対応してインデント)
:set smartindent
" 端で折り返す
:set wrap
" シンタックスハイライト
:syantax on
:syntax off
```

# .vimrcについて
ホームディレクトリに```.vimrc```なるファイルを置いて、そこに設定を書き込むことでカスタマイズができます。  
僕はあんま詳しくないので、下記リンクを参考にしてください。  

https://qiita.com/iwaseasahi/items/0b2da68269397906c14c  

# おわりに
その他便利そうなコマンドの記事がありました。

https://qiita.com/jnchito/items/57ffda5712636a9a1e62

あと、プラグインとか作るときに使う、VimScriptってのもあるんですが、僕もVim初心者なのでよくわからない。  

ちなみに今急性Vim中毒になりそうです。（？）すぐ治ると信じてます。VSCode使うとストレス溜まるのは悲しいので。  

（みんな記事の最後ってどうやって締めるんだろう）