Visual Studio Codeの機能拡張「Vim」の為のメモ

動機
==================================================
* うろ覚えvi使いの自分が最近Codeを使う関係上、VSCodeVimの挙動を理解しておく必要があった
* 本当はPureなViの便利コマンドとかも覚えたいけど、Code上で使えないと混乱するのでCode
で使えるもののみメモしておこうと思った。


注意事項
==================================================
VSCodeのステータスバーに出るモード表示が、一般のVimと異なるので対応表をつけておく。

Code+Vim    | Vim
------------|-----------------
NORMAL MODE |ノーマルモード
INSERT MODE |挿入モード
REPLACE     |上書きモード
VISUAL MODE |ビジュアルモード

また、日本語入力状態のままNORMAL MODEに戻ると、NORMAL MODE時のコマンドが
入力できないので、日本語入力モードをOFFにする必要がある。

したがって、オフィスはWindows、家ではMacを使っているので日本語入力ON/OFFキーの
位置が異なる為、たまに困る。

苦肉の策としてはせめてWindowsとMacで同じようなキー操作感にする為、Windowsの
OSレベルでのキーバインド編集で「スペースキー」左にある「無変換」を「IMEオフ」に
なるよう設定する。


モード切替編
==================================================

困ったら`Esc`キーを押すとよい。

キー入力 | モード  | 動き
---------|---------|-------------------------
`Esc`      | すべて  | NORMAL MODEへ遷移
`i`        | NORMAL  | カーソル位置からINSERT MODEに遷移
`I`       | NORMAL  | 行頭からINSERT MODEに遷移
`a`        | NORMAL  | カーソルの次位置からINSERT MODEに遷移
`A`       | NORMAL  | 行末からINSERT MODEに遷移
`R`       | NORMAL  | カーソル位置からREPLACEに遷移
`s`        | NORMAL  | カーソル位置の文字を削除すると同時にINSERT MODEに遷移

移動編
==================================================
キー入力 | モード  | 動き
---------|---------|-------------------------
`j`, `k`,`h` or `l`     | NORMAL  | カーソル移動。それぞれの文字が「↓↑←→」に対応
`nj`       | NORMAL  | n行↓に移動(他`k`,`h`,`l`キーも同様)(**nは数字です**
`^`        | NORMAL  | 行頭に移動
`$`        | NORMAL  | 行末に移動
`gg`       | NORMAL  | 先頭行へ移動
`G`       | NORMAL  | 最終行へ移動
`nG`      | NORMAL  | n行目に移動(**nは数字です**)
`Ctrl-f`   | NORMAL  | 1画面分下に移動
`Ctrl-b`   | NORMAL  | 1画面分上に移動
`Ctrl-e`   | NORMAL  | 画面の下スクロール
`Ctrl-y`   | NORMAL  | 画面の上スクロール

入力編
==================================================

特に`Ctrl-e`, `Ctrl-y`は機能は知っていても、欲しいときに思い出せないという
ジレンマを味わうこと過去多数。今度こそ覚えた！

キー入力 | モード  | 動き
---------|---------|-------------------------
`Ctrl-e`   | INSERT  | 真下の文字と同じものが入力される
`Ctrl-y`   | INSERT  | 真上の文字と同じものが入力される
`Ctrl-h`   | INSERT  | バックスペース
`Ctrl-w`   | INSERT  | 単語レベルでのバックスペース

`Ctrl-e`, `Ctrl-y`の挙動はこんな感じになる

```fsharp
let E_HOGE_INVALID_ARGS = 1
//<-----------------------------------この位置からCtrl-yを押すと
```

```fsharp
let E_HOGE_INVALID_ARGS = 1
let E_HOGE_INVALID_//<----------------異なる部分まで繰り返す
```

```fsharp
let E_HOGE_INVALID_ARGS = 1
let E_HOGE_INVALID_TIME = 2 //<-------残りはそのままキー入力で記述
```

行コピーを利用しても良いんだが、変更箇所の部分まで移動して、INSERT MODEにして、またNORMAL MODEに戻して移動して……というのが地味にツライ。
(カーソルキーとDeleteキーを併用すれば1回のINSERT MODEでいけるけどポジショニングが悪くなるので微妙)

編集編
==================================================

キー入力 | モード  | 動き
---------|---------|-------------------------
`u`        | VISUAL  | 選択領域の英字をすべて小文字化
`U`       | VISUAL  | 選択領域の英字をすべて大文字化
`S<t>`     | VISUAL  | 選択領域の前後を<t>文字で囲む。サラウンド入力  
`~`        | NORMAL  | カーソル位置の英字の大文字小文字反転して次に進む。<br>VISUAL MODE時にも使用できる      
`x`        | NORMAL  | カーソル位置の文字を削除(Delete)
`r`       | NORMAL  | カーソル位置の１文字だけ置換するモードに変わり置換後はNORMAL MODEに戻る
`u`        | NORMAL  | Undo
`Ctrl-r`   | NORMAL  | Redo
`ds<t>`    | NORMAL  | <t>文字で囲まれている領域の<t>だけ削除する。サラウンド削除   

VISUAL MODEでの`S<t>`は意外とややこしい。とりあえず、手段は色々ありますが、わかりやすいのは対象の領域をVISUAL MODEで選択し、`S`を入力した後に、囲みたい文字を入れる手順。
例えば、マークダウンで「`」で囲みたい時なんかこれを使うと楽になる。

サラウンド削除するための`ds<t>`コマンドがたまに効かなくなるのが辛い…。