Vimチートシート

本記事ではvimのデフォルト操作方法について記載するものとする．

:::note info
**Vimとは**
高度にカスタマイズ可能なテキストエディタ．Vi IMproved（Viの改良版）の略称で、元々のViエディタを拡張し、多くの機能を追加したものである．コマンドラインインターフェース（CLI）で動作し、効率的なテキスト編集を可能にする。
:::

# 他のチートシート
lazygit

https://qiita.com/JavaLangRuntimeException/items/42087d09728d5739d73d

> gitをvim操作したい方使ってみてください！

SQL

https://qiita.com/JavaLangRuntimeException/items/f038fbaccdd92fb0308a

Docker コマンド

https://qiita.com/JavaLangRuntimeException/items/21f7c7bf3d143f821697

git/gh コマンド

https://qiita.com/JavaLangRuntimeException/items/6b46551f56e0def76eba

TypeScript

https://qiita.com/JavaLangRuntimeException/items/5894391c08e0d8e28389

Go・Gorm

https://qiita.com/JavaLangRuntimeException/items/d388717fc1436bc3ec9d

C#/.NET/Unity

https://qiita.com/JavaLangRuntimeException/items/7849b32bc223d4aa0247

C#/.NET/Unity

https://qiita.com/JavaLangRuntimeException/items/7849b32bc223d4aa0247

Ruby・Ruby on Rails

https://qiita.com/JavaLangRuntimeException/items/42d935cf92c212f1c7ec

プルリクエスト・マークダウン記法チートシート

https://qiita.com/JavaLangRuntimeException/items/329eb92a47a07ff4dde8

ファイル操作コマンドチートシート

https://qiita.com/JavaLangRuntimeException/items/16f244606a73f7d106e4

ステータスコード

https://qiita.com/JavaLangRuntimeException/items/ab1bc7b976ed2dfad91c

VSCode Github Copilot拡張機能

https://qiita.com/JavaLangRuntimeException/items/be13dc3a346cf6e5ee44

OpenAI Assistants API

https://qiita.com/JavaLangRuntimeException/items/1a1abc01e8d7d05dce93

Github API

https://qiita.com/JavaLangRuntimeException/items/4f3551c31679233219ac

変数・関数(メソッド)・クラス命名規則

https://qiita.com/JavaLangRuntimeException/items/b93865c448f69bcfca4a

# 他のシリーズ記事
**TypeScriptで学ぶプログラミングの世界**
プログラミング言語を根本的に理解するシリーズです．

https://qiita.com/JavaLangRuntimeException/items/cadf49bb419076819963

**情報処理技術者試験合格への道[IP・SG・FE・AP]**
情報処理技術者試験に出題されるコンピュータサイエンス用語の紹介や単語集

https://qiita.com/JavaLangRuntimeException/items/991be402099542ccb936

**IAM AWS User クラウドサービスをフル活用しよう！**
AWSのサービスを例にしてバックエンドとインフラ開発の手法を説明するシリーズです．

https://qiita.com/JavaLangRuntimeException/items/371a334f5a6e07035db5

**AWS UserのGCP浮気日記**
GCPの様子をAWSと比較して考えてみるシリーズ

https://qiita.com/JavaLangRuntimeException/items/527d99e774165a763180

**Project Gopher: Unlocking Go’s Secrets**
Go言語や標準ライブラリの深掘り調査レポートです．

https://qiita.com/JavaLangRuntimeException/items/dc45b412d3fbd2ccb9e8

**Gopher’s Journey: Exploring TCP Protocol**
Goを用いてTCPプロトコルを探求 & 作成するシリーズです．

https://qiita.com/JavaLangRuntimeException/items/38091220106d86651d2b

# Vimが使われる場面

Vimは以下のような場面で広く使用されている：

1. プログラミング: 多くのプログラマーがコード編集に使用する。
2. サーバー管理: リモートサーバーでのファイル編集に適している。
3. 設定ファイルの編集: システム設定ファイルの編集によく用いられる。
4. テキスト処理: 大量のテキストデータの処理や編集に効果的だ。
5. 論文や文書作成: LaTeXなどと組み合わせて学術論文の作成に使用される。

# Vimのモード

Vimには複数のモードがあり、各モードで異なる操作が可能である
1. ノーマルモード：
   - デフォルトのモードで、様々なコマンドを実行できる
   - カーソル移動、テキスト操作、他のモードへの切り替えが可能だ

2. 挿入モード：
   - テキストを入力するためのモードである
   - ノーマルモードから`i`、`a`、`o`などのキーで入る

3. ビジュアルモード：
   - テキストを選択するためのモードだ
   - 文字単位、行単位、矩形選択が可能である

4. コマンドラインモード：
   - 画面下部にコマンドを入力して実行するモードである
   - ファイルの保存、終了、検索、置換などの操作を行う

5. Ex（イーエックス）モード：
   - 複数のコマンドを連続して実行するためのモード
   - `:visual`コマンドでノーマルモードに戻る

6. 置換モード：
   - 既存のテキストを上書きするモードである
   - ノーマルモードから`R`キーで入る

# Vimの全操作

## モード切替

### ノーマルモードへの切替
- `Esc`: 他のモードからノーマルモードに戻る。

### 挿入モードへの切替
- `i`: カーソル位置の前に挿入する。
- `a`: カーソル位置の後に挿入する。
- `I`: 行頭に挿入する。
- `A`: 行末に挿入する。
- `o`: カーソル行の下に新しい行を挿入する。
- `O`: カーソル行の上に新しい行を挿入する。

### ビジュアルモードへの切替
- `v`: 文字単位で選択する。
- `V`: 行単位で選択する。
- `Ctrl+v`: 矩形選択する。

### コマンドラインモードへの切替
- `:`: コマンドラインモードに入る。

### Ex（イーエックス）モードへの切替
- `Q`: Exモードに入る。

### 置換モードへの切替
- `R`: 置換モードに入る。

## カーソル移動

### 基本的な移動
- `h`: 左に移動する。
- `j`: 下に移動する。
- `k`: 上に移動する。
- `l`: 右に移動する。

### 単語単位の移動
- `w`: 次の単語の先頭に移動する。
- `b`: 前の単語の先頭に移動する。
- `e`: 現在または次の単語の末尾に移動する。
- `W`, `B`, `E`: 空白で区切られた単語単位で移動する。

### 行内の移動
- `0`: 行頭に移動する。
- `^`: 行頭の最初の非空白文字に移動する。
- `$`: 行末に移動する。
- `f{char}`: 指定した文字{char}まで右に移動する。
- `F{char}`: 指定した文字{char}まで左に移動する。
- `t{char}`: 指定した文字{char}の手前まで右に移動する。
- `T{char}`: 指定した文字{char}の手前まで左に移動する。

### ページ単位の移動
- `Ctrl+f`: 1画面下にスクロールする。
- `Ctrl+b`: 1画面上にスクロールする。
- `Ctrl+d`: 半画面下にスクロールする。
- `Ctrl+u`: 半画面上にスクロールする。
- `zt`: 現在行を画面の最上部に移動する。
- `zz`: 現在行を画面の中央に移動する。
- `zb`: 現在行を画面の最下部に移動する。

### ファイル内の移動
- `gg`: ファイルの先頭に移動する。
- `G`: ファイルの末尾に移動する。
- `:n`: n行目に移動する（nは行番号）。
- `%`: 対応する括弧に移動する。

## 編集操作

### 削除
- `x`: カーソル位置の文字を削除する。
- `X`: カーソルの前の文字を削除する。
- `dd`: 現在の行を削除する。
- `D`: カーソル位置から行末まで削除する。
- `dw`: カーソル位置から単語の末尾まで削除する。
- `d$`: カーソル位置から行末まで削除する。
- `d^`: カーソル位置から行頭まで削除する。
- `d0`: カーソル位置から行頭まで削除する。
- `dgg`: カーソル位置からファイルの先頭まで削除する。
- `dG`: カーソル位置からファイルの末尾まで削除する。

### コピー（ヤンク）
- `yy`: 現在の行をコピーする。
- `Y`: 現在の行をコピーする（`yy`と同じ）。
- `yw`: カーソル位置から単語の末尾までコピーする。
- `y$`: カーソル位置から行末までコピーする。
- `y^`: カーソル位置から行頭までコピーする。
- `y0`: カーソル位置から行頭までコピーする。
- `ygg`: カーソル位置からファイルの先頭までコピーする。
- `yG`: カーソル位置からファイルの末尾までコピーする。

### ペースト
- `p`: カーソルの後にペーストする。
- `P`: カーソルの前にペーストする。

### 置換
- `r`: カーソル位置の文字を置換する。
- `R`: 置換モードに入る。

### テキスト整形
- `>>`: 現在の行をインデントする。
- `<<`: 現在の行のインデントを減らす。
- `==`: 現在の行を自動インデントする。
- `gq`: 選択したテキストを整形する。

### アンドゥとリドゥ
- `u`: 直前の操作を取り消す（アンドゥ）。
- `Ctrl+r`: 取り消した操作をやり直す（リドゥ）。

### その他の編集操作
- `.`: 直前の編集操作を繰り返す。
- `J`: 現在の行と次の行を結合する。
- `gJ`: 現在の行と次の行を空白なしで結合する。
- `~`: カーソル位置の文字の大文字小文字を切り替える。
- `gU{motion}`: 指定した範囲を大文字に変換する。
- `gu{motion}`: 指定した範囲を小文字に変換する。

## 検索と置換

### 検索
- `/pattern`: 前方検索する。
- `?pattern`: 後方検索する。
- `n`: 次の検索結果に移動する。
- `N`: 前の検索結果に移動する。
- `*`: カーソル位置の単語を前方検索する。
- `#`: カーソル位置の単語を後方検索する。

### 置換
- `:s/old/new`: 現在の行で最初に見つかった'old'を'new'に置換する。
- `:s/old/new/g`: 現在の行のすべての'old'を'new'に置換する。
- `:%s/old/new/g`: ファイル全体のすべての'old'を'new'に置換する。
- `:%s/old/new/gc`: ファイル全体のすべての'old'を'new'に置換する（確認あり）。

## ファイル操作

### 保存
- `:w`: 現在のファイルを保存する。
- `:w filename`: 指定したファイル名で保存する。
- `:wa`: 開いているすべてのファイルを保存する。

### 終了
- `:q`: Vimを終了する（変更がない場合）。
- `:q!`: 変更を破棄してVimを終了する。
- `:wq`: 保存してVimを終了する。
- `:x`: 保存してVimを終了する（`:wq`と同じ）。
- `ZZ`: 保存してVimを終了する（`:x`と同じ）。
- `ZQ`: 変更を破棄してVimを終了する（`:q!`と同じ）。

### 新規ファイル
- `:e filename`: 新しいファイルを編集する。
- `:enew`: 新しい無名バッファを作成する。

### ファイル情報
- `Ctrl+g`: 現在のファイル名と状態を表示する。
- `:f`: 現在のファイル名と状態を表示する。

## ウィンドウ操作

### 画面分割
- `:sp`: 水平方向に画面を分割する。
- `:vsp`: 垂直方向に画面を分割する。
- `Ctrl+w s`: 水平方向に画面を分割する。
- `Ctrl+w v`: 垂直方向に画面を分割する。

### ウィンドウ間の移動
- `Ctrl+w h`: 左のウィンドウに移動する。
- `Ctrl+w j`: 下のウィンドウに移動する。
- `Ctrl+w k`: 上のウィンドウに移動する。
- `Ctrl+w l`: 右のウィンドウに移動する。
- `Ctrl+w w`: 次のウィンドウに移動する。

### ウィンドウのサイズ変更
- `Ctrl+w =`: すべてのウィンドウの高さと幅を均等にする。
- `Ctrl+w _`: 現在のウィンドウの高さを最大化する。
- `Ctrl+w |`: 現在のウィンドウの幅を最大化する。
- `Ctrl+w +`: 現在のウィンドウの高さを増やす。
- `Ctrl+w -`: 現在のウィンドウの高さを減らす。
- `Ctrl+w >`: 現在のウィンドウの幅を増やす。
- `Ctrl+w <`: 現在のウィンドウの幅を減らす。

### タブ操作
- `:tabnew`: 新しいタブを開く。
- `:tabc`: 現在のタブを閉じる。
- `:tabo`: 他のすべてのタブを閉じる。
- `gt`: 次のタブに移動する。
- `gT`: 前のタブに移動する。

## マクロ

### マクロの記録
- `q{a-z}`: 指定した文字のレジスタにマクロの記録を開始する。
- `q`: マクロの記録を終了する。

### マクロの再生
- `@{a-z}`: 指定したレジスタのマクロを再生する。
- `@@`: 最後に実行したマクロを再生する。

## 4.8 その他の機能

### マーク
- `m{a-zA-Z}`: 現在の位置にマークを設定する。
- `'{a-zA-Z}`: 指定したマークにジャンプする。

### レジスタ
- `"{a-z}y`: 指定したレジスタにヤンクする。
- `"{a-z}p`: 指定したレジスタからペーストする。

### 折りたたみ
- `zf`: 選択範囲を折りたたむ。
- `zo`: 折りたたみを開く。
- `zc`: 折りたたみを閉じる。

### スペリングチェック
- `:set spell`: スペリングチェックを有効にする。
- `:set nospell`: スペリングチェックを無効にする。
- `]s`: 次のスペルミスに移動する。
- `[s`: 前のスペルミスに移動する。
- `z=`: スペルミスの修正候補を表示する。

### 差分モード
- `vimdiff file1 file2`: 2つのファイルの差分を表示する。
- `]c`: 次の差分に移動する。
- `[c`: 前の差分に移動する。