Vimの基本操作コマンド集（vimtutorメモ）

## はじめに
vimtutorで学んだVimの基本操作を元に、作業時にコマンドを参照しやすいように用途別にカテゴリ分けして整理しました。

## 1. Vimのモードについて
Vimには以下の基本的なモードがある。

| モード | 用途 |
|:-|:-|
| ノーマルモード | 移動や編集、削除などの基本操作を行うモード（デフォルト）。<br>他のモードからはescキーで戻る。 |
| 挿入モード | テキストを入力するモード（iやaで移行） |
| ビジュアルモード | テキストの範囲を指定して操作するモード（vやVで移行） |
| コマンドラインモード | 保存や終了、検索などのコマンド入力をするモード<br>（:キーで移行） |

## 2. Vimの起動と終了
|コマンド|実行内容|
|:-|:-|
|vim|Vimを起動する|
|vim ファイル名|Vimでファイルを開く|
|vi --version|「VIM - Vi IMproved ○○」と表示された場合、<br>viコマンドがvimを指している<br>（エイリアスやシンボリックリンクになっている）|
|:w|上書き保存|
|:w ファイル名|現在のファイルを指定したファイル名で保存<br>（同一ファイルがある場合上書き保存）|
|:wq|保存して終了|
|:wq ファイル名|現在のファイルを指定したファイル名で保存して終了<br>（同一ファイルがある場合上書き保存して終了）|
|ZZ|変更があれば保存して終了。なければそのまま終了|
|:q!|保存せず強制終了|

## 3. カーソル移動
|コマンド|実行内容|
|:-|:-|
|h, j, k, l|←・↓・↑・→へ移動|
|0|行の先頭に移動|
|$|行の末尾に移動|
|e|次の単語末尾へ移動|
|ge|前の単語末尾へ移動|
|w|次の単語先頭へ移動|
|b|前の単語先頭へ移動|
|gg|ファイルの先頭へ移動|
|G|ファイルの最終行へ移動|
|行番号+G|指定行に移動|
|ctrl+o|前の位置に戻る|
|ctrl+i|前に進む|
|%|対応する括弧に移動|
|ctrl+g|現在の行番号・総行数・ファイル名・バイト数を表示|
|:set ruler|常に行番号・位置を表示|

## 4. 文字や単語の編集
|コマンド|実行内容|
|:-|:-|
|x|文字を削除|
|i|カーソルの前に挿入（挿入モード開始）|
|a|カーソルの後ろに挿入|
|A|行末に挿入|
|o|下に新しい行を挿入|
|O|上に新しい行を挿入|
|cw or ce|カーソル位置から単語の末尾まで変更|
|cw（カーソルが単語末尾のとき）|末尾の文字を変更|
|cw（カーソルが空白にあるとき）|次の単語の手前まで変更|
|ce（カーソルが単語末尾のとき）|次の単語の末尾まで変更|
|ce（カーソルが空白にあるとき）|次の単語の末尾まで変更|
|cc|行全体を変更|
|c$|カーソル位置から行末まで変更|
|C|カーソル位置から行末まで削除して挿入<br>（d$ → iと同じ動作）|
|r|1文字置換|
|R|連続置換モード|

## 5. 削除・切り取り
Vimでは削除や編集コマンドで消した部分は実際には切り取りされており、貼り付け（p）で再利用できる。

|コマンド|実行内容| 
|:-|:-|
|dw|カーソル位置から次単語まで削除（空白含む）|
|de|カーソル位置から単語末尾まで削除|
|dd|行全体を削除|
|2dd|2行分を削除|
|d$|カーソル位置から行末まで削除|
|d2w|カーソル位置から2単語目の末尾まで削除|

## 6. コピー・貼り付け
|コマンド|実行内容|
|:-|:-|
|yw|カーソル位置から次の単語の手前までコピー（空白含む）|
|yy|行をコピー|
|p|カーソルの後ろに貼り付け（行コピーのときは次の行に貼り付け）|

## 7. Undo・Redo
|コマンド|実行内容|
|:-|:-|
|u|Undo（直前の操作の取り消し）|
|U|行全体のUndo|
|ctrl+r|Redo（Undoを取り消す）|

## 8. 検索
|コマンド|実行内容|
|:-|:-|
|/検索語|検索|
|n|次の一致へ移動|
|N|前の一致へ移動|

## 9. 置換
|コマンド|実行内容|
|:-|:-|
|:s/置換前文字列/置換後文字列|行内最初の一致のみ置換|
|:s/置換前文字列/置換後文字列/g|行内全て置換|
|:#,#s/置換前文字列/置換後文字列/g|指定行（#,#部分で指定）の範囲内で置換|
|:%s/置換前文字列/置換後文字列/g|ファイル全体で置換|
|:%s/置換前文字列/置換後文字列/gc|1つずつ確認しながらファイル全体で置換|

## 10. 検索オプション
|コマンド|実行内容|
|:-|:-|
|:set ic|大文字小文字を無視|
|:set noic|大文字小文字を区別|
|/検索語\c|一時的に大文字小文字を無視して検索|
|:set hls|検索語をハイライト表示|
|:set nohls|ハイライトを無効化|

## 11. 外部コマンドとファイル操作
|コマンド|実行内容|
|:-|:-|
|:!コマンド|外部コマンドを実行（例 :!ls）|
|:w ファイル名|現在のファイルを指定したファイル名で保存<br>（同一ファイルがある場合上書き保存）|
|:w >> ファイル名|現在のファイルを指定したファイルに追記|
|:saveas ファイル名|現在のファイルを指定したファイル名で保存し、そのファイルに編集対象を切り替える|
|:!rm ファイル名|指定したファイルを削除|
|:r ファイル名|カーソル位置に指定したファイルの内容を挿入|
|:r !ls|カーソル位置にlsコマンドの結果を挿入|

## 12. ビジュアルモード（範囲選択）
|コマンド|実行内容|
|:-|:-|
|v|ビジュアルモード開始|
|V|行単位でのビジュアルモード|
|範囲選択後 :w ファイル名|選択範囲を指定したファイルに保存<br>（同一ファイルがある場合上書き保存）<br>※範囲選択中に「:」を打つと「:'<,'>」 とステータスライン（画面下部）に表示される|

## 13. ヘルプの使い方
|コマンド|実行内容|
|:-|:-|
|:help or F1|ヘルプ表示|
|:help コマンド名|指定したコマンドに関するヘルプを表示（例 :help w）|
|:q|ヘルプ終了|

## 14. Vimの設定（起動スクリプトの作成）
Vimはデフォルトでは多くの機能が使用不可となっているのでvimrcファイルを作成しVim固有の機能を使えるようにする。

1. 設定ファイルを開く
Unix： :e ~/.vimrc
Windows： :e ~/_vimrc

2. サンプル設定を読み込む
:r $VIMRUNTIME/vimrc_example.vim

3. 保存して終了
:wq

これにより次回Vim起動時から色付け構文が使えるようになる。
vimrcファイルへ設定を追加することで他にもカスタムできる。
:help vimrc-intro で調べられる。

## 15. コマンドの補完
1. 互換モードでないことを確認（互換モードの無効化）<br>:set nocp
※互換モード=Viと同じ動作をするモード
2. コマンドの先頭入力後、ctrl+dで候補表示
3. tabキーで補完<br>editコマンドを候補表示から指定する場合<br> :e tab → ctrl+d → d → tab → :edit<br>（ctrl+dを使わずにコマンドを途中まで入力後tabで候補に変換も可）

## 16. 「オペレーター（動作）」と「モーション（移動コマンド）」の違いについて
Vimでは「削除」「コピー」「変更」などの操作をする際に、「どの範囲に対して実行するか？」を指定するルールがある。
さらに「回数」を指定して操作を繰り返すこともできる。

### 1. オペレーター（動作）とは
「何をするか？」を指定するコマンドのこと。

|コマンド|動作|
|:-|:-|
|d|削除（delete）|
|y|コピー（yank）|
|c|変更（change）|
|>|インデントを増やす|
|<|インデントを減らす|

Vimでは「オペレーターだけでは完結せず、どの範囲に適用するのか？」を決める必要がある。
この「範囲の指定」に使われるのが「モーション（移動コマンド）」。

### 2. モーション（移動コマンド）とは
「どこからどこまで？」を指定するコマンドのこと。
オペレーターと組み合わせて操作する範囲を決る。

|コマンド|移動先|
|:-|:-|
|e|次の単語の末尾へ移動|
|ge|前の単語の末尾へ移動|
|w|次の単語の先頭へ移動|
|b|前の単語の先頭へ移動|
|0|行の先頭へ移動|
|^|行の最初の非空白文字へ移動|
|$|行の末尾へ移動|
|G|ファイルの最終行へ移動|

モーションは単体でも使える。

### 3. オペレーター（動作）とモーション（移動）の組み合わせ
組み合わせの例

|コマンド|実行内容|
|:-|:-|
|dw|カーソル位置から次の単語の先頭まで削除|
|d$|カーソル位置から行末まで削除|
|y0|カーソル位置から行頭までコピー|
|cG|カーソル位置からファイルの最終行まで変更|
|>}|現在の段落全体のインデントを増やす|

### 4. 「回数」の指定方法
Vimでは多くのコマンドに 「回数」を指定して繰り返し適用することができる。

#### 1. オペレーター（動作）の前に回数を指定
動作コマンドの前に回数を指定するとその動作を繰り返す。

|コマンド|実行内容|
|:-|:-|
|2dd|2行削除（ddを2書い実行）|
|3yy|3行コピー（yyを3回実行）|
|4p|4回貼り付け|

#### 2. モーション（移動）の前に回数を指定
移動コマンドの前に回数を指定するとその移動を繰り返す。

|コマンド|実行内容|
|:-|:-|
|3w|3単語先へ移動|
|2e|2単語先の末尾へ移動|
|5G|5行目に移動|

#### 3. 「オペレーター + モーション」の場合の回数
オペレーターとモーションを組み合わせるときに、回数をどこに指定するかで意味が変わる。

|コマンド|実行内容|
|:-|:-|
|2dd|2行削除（ddを2回実行）|
|d2w|2単語削除（wの移動を2回分）|

### 5. 単独で完結するコマンドと分類の違い
Vimには「オペレーター + モーション」のように、構造的な操作が求められるコマンドがある一方で、xのようにそれ単体で完結するシンプルなコマンドも存在する。

|コマンド|実行内容|分類|
|:-|:-|:-|
|x|カーソル位置の1文字を削除|単独コマンド（狭義のコマンド）|
|dl|カーソル位置の1文字を削除|オペレーター + モーション|

x は動作の内容（削除）がdに似ているがオペレーターでもモーションでもない。あくまで「単独で完結するコマンド」として扱われる。

- Vimにおける分類の整理
Vimの設計思想ではユーザーが操作するコマンドを以下のように分類している。

|分類|役割|例|
|:-|:-|:-|
|コマンド（狭義）|単独で動作するキー操作|x, i, :w|
|オペレーター|モーションと組み合わせて「何をするか」を指定|d, y, c|
|モーション|どの範囲に対して処理を行うかを指定|w, e, $, }|

## おわりに
この記事自体も練習を兼ねて実際にVimで書いてみました。
慣れてくるとなかなか面白かったです。