脳を鍛える大人のvimトレーニング - 挿入モードを理解する

やっとじっくりとリファレンスが読める時間が出来たので、今週は挿入モードに関してガッツリ調べていきたいなーと…

## AIがとまらない

まずは基本をおさらいせねば…

|Where|Which|Command|
|--:|--:|:-:|
|カーソルの|後ろから|`a`(ppend)|
||前から|`i`(nsert)|
|行の|最後から|`A`|
||先頭から|`I`|
||下に新しい行から|`o`|
||上に新しい行から|`O`|
|前の編集箇所から||`gi`|

このへんはよく理解しているので改めて確認したという感じです。問題は理解しただけで使えてないわけなんだけど…他のエディタの癖が抜けないのでいまだに行末にカーソルを持っていく癖が抜けないんですよ。同様に癖が抜けないので行末にカーソル持っていったら改行コード分を汲んでくれると思って`i`押して…ということが多いので、うまく`a`と`A`を使っていかないとダメってことっすね。この他にインデントを無視した行頭から挿入する`gI`があるんだけど、まぁこれは使わなそうなのでいいや…整形された文章作るときはもっぱらGsuiteやLibreOfficeに任せてるし。

### 前回のトレーニング！

解説の前に初心者の備忘録に付き合っていいね！押していただいてありがとうございます。おかげでいい具合にモチベーションが保てております。で、その[ガッツリいいねもらったエントリでまとめたオブジェクト単位の選択](https://qiita.com/astrorobot110/items/4cce7b4871eb3b8fd341)で、`なんちゃらa`/`なんちゃらi`の内側/外側の関係をまとめたんですけど、この関係と挿入モードの関係がよく対応してるのでここもうまく記憶とリンクしておくべきだなと思っております。うまく説明できんけどとっても似てるイメージなんです。

### 挿入モードの繰り返しに注意！

挿入モードの際にもカウントが使えるので、これ改行一気に入れたい時に`2o`とかするの便利だなぁと思ったんですけど、
挿入自体を繰り返してしまうのでそんなに役立たなかったんですよ。繰り返しを意識しようとするとついやってしまうので気をつけないと…
挿入自体を繰り返してしまうのでそんなに役立たなかったんですよ。繰り返しを意識しようとするとついやってしまうので気をつけないと…

大事なことなので2回言いました。[^1]

[^1]: ソースのMarkdown参照

## (挿入モード中に)わたしにできること

本当によくチェックしておきたかったのは挿入モード中のコンビネーションキーだったのでここ重点で…

### 小指に頼るな

もっとvimっぽく、というかギーグっぽくエンターキーを「ﾀｰﾝｯ!」って**するのをやめて、**Ctrlを使ってできるコンビネーションはどんどんそちらに寄せていこうと思ったのでちょっとそこをまとめておきます。

|Ctrl+||
|:-:|:-:|
|`[`|`<Esc>`|
|`m`|`<CR>`|
|`h`|`<BS>`|
|`i`|`<Tab>`|

要は`<Esc>`辞めるんなら`<CR>`,`<BS>`,`<Tab>`も視野に入れたらどうや？と思ったんですよ。昔よく**（ぉ**みたいな90年代オタクのイキｒ**^h^h…**

…歳バレますね、さておき、いらないオタク知識としてでも`^H`知ってるんだからちゃんと活用しなさいって話っすね。この文章打ってる時点で当たり前のようにホームから手離すんで先は長いんですけど。まーこのままvimと添い遂げると決めたんで、USキーボード買えば`<C-[>`のクセくらいはついてくれるんじゃないかなーって。ちなみに`Esc`のつもりでも使える`<C-c>`は、一応Linuxの癖もあるんで手につくキーバインドなんですけど、文章打ってる最中には押していけなかったんで、何かちょっと挙動違うらしいし、「そういうのがある」だけ覚えておきました。

で、これは完全に備忘録なんですけど、`hjkl`にもっと依存するために追加したOS側のバインドを確認…

||Ctrl+||
|:-:|:-:|:--|
||`<Space>`|IMEのon/off|
|変換中に|`h`|文節を左に移動|
||`j`|次の変換候補|
||`k`|前の変換候補|
||`l`|文節を右に移動|
||`H`|文節を縮める|
||`L`|文節を伸ばす|

Ctrl+Shift押しづらいんでいっそ旧ATOKバインド風で頑張ろうかと思ったんですけど、今更戻れませんでした。

## 魂の座

コピペその他、使い回しに関するキーバインドが結構あったのでちゃんと確認しようと思います。ちょっと複雑に見えたので`<C-r>`に関してだけ先に…

|↓制御コード \ 改行後のインデント→|する|しない|
|:-:|:-:|:-:|
|タイプされたものとみなす|`<C-r>[レジスタ]`|`<C-r><C-o>[レジスタ]`|
|そのまま貼り付ける|`<C-r><C-r>[レジスタ]`|`<C-r><C-p>[レジスタ]`|

「制御コード」に関しては、例えばレジスタに`^M`の制御コードが入ってたら改行と解釈するかどうかって認識で良さそう。インデントの方は「インデントをした行を`<C-r>`から使うと改行時のオートインデントが更に掛かる」ことだけ覚えとけば気をつけられそうです。まー使いたいのは`<C-r><C-o>+`くらいっすね。どっちかって言うと`+`以外の特殊なレジスタ覚える方が先か。

|特殊なレジスタ|内容|
|:-:|:--|
|`"`|最後にヤンク/削除された内容 (名前なしレジスタ)|
|`[0-9]`|ヤンクしたものの履歴 (0が直近)|
|`-`|直近の削除したものの履歴 (取るのは一つだけ)|
|`[a-zA-Z]`|`"[a-zA-Z]`で指定したレジスタ|
|`+`|クリップボード、**もしくはX端末上のプライマリセレクション**|
|`*`|クリップボード **(OSを問わない)**|
|`:`|最後に実行したコマンド|
|`/`|最後に実行した検索パターン|
|`.`|最後に挿入したテキスト|
|`%`|カレントファイル名|
|`=`|式評価|

概ね使ったことあるものだけだったので大丈夫だろうなと思うんだけど、式評価は意識してもいいのかなぁ…関数覚えないとっすね。リファレンスの気になる記述は`<C-r><C-o>.`をしても`<C-r>.`と一緒らしいので忘れると大変なことになるやつですねこれ。ちなみに`".`のレジスタは挿入モード中に繰り返しが出来る`<C-a>`や`<C-@>`で使っているそうで、ちなみに`".`のレジスタは挿入モード中に繰り返しが出来る`<C-a>`や`<C-@>`で使っているそうで、大事なことなので2回言いました[^2]

[^2]: 要は編集中に試してるってことです。

## ケミカルマジカルVimming

こっからは把握が甘いところの学習です。

### `<BS>`より更に速く

`<C-w>`を使うとノーマルモードの`b`相当分のバックスペースが出来るとのことなので、派手に間違えたときには…いや一旦挿入モード終われば？と思うんだけど、どうでしょ？挿入モード抜ける癖つかないよねこういうの覚えちゃうと。更に豪快に間違えてたときは`<C-u>`で挿入前の状態までアンドゥできるんだけど、よくIMEのonを忘れるのでこれで戻してあげれば手っ取り早くなりそう。

### `<C-y>`,`<C-e>`が超有能

`<C-y>`/`<C-e>`で上/下の行をそのままトレース出来る。もう使い込んでるけど忘れないように。

### 挿入モードからインデントを操作する

上手く使えるかどうかはわからないけどちゃんと把握しておくように。`<C-t>`/`<C-d>`で現在行をインデント/逆インデント、`0<C-d>`でインデントを消す、`^<C-d>`で現在行だけインデントを消して、改行後にインデントを戻す。最後のは「ラベル入力に役立つ」そうで…これバッチファイルでやりたかったやつっすね。

### 特殊な文字をそのまま入力する方法

[ホームポジションを維持するための活用](#小指に頼るな)と逆で、スクリプト上の特殊なキー定義や、ここの更新で書くためにラク出来ることとして、`<C-k>`からVimで使うダイグラフを直接入力できるのと、`<C-v>`から制御コードを入力できるので必要な時に頑張って思い出す事。制御コード、使うかなぁー…よく分かってなかった時に正規表現中に`^M`とかは確かにやってたんだけど…

## 今の僕には理解できない

スクリプト書く時にクッソ便利そうな`<C-x>`なんだけど、ちょっと使いこなせる自信ないどころかそんなにスクリプトも書かないので、とりあえず今把握して便利そうなやつだけ…

|&lt;C-x&gt;…|補完するもの|
|:-:|:--|
|`<C-d>`|定義、もしくはマクロ|
|`<C-v>`|vimのコマンド|

理解できたのはこれだけでした。候補が出たら選択は`<C-n>`(ext)と`<C-p>`(revious)で…にしても`<C-x><C-d>`はもう十分活用できてるので及第点かもしれないです。まぁスクリプト殆ど書かないからね。今はvimscriptだけなんとかなれば…

## 今日はここまで

なんだかんだでこのお勉強、当たり前のように半日持っていくんでしんどいんですよ。

え、`:read`？…いやなんか、流し込めるんでしょ？(もう個人的なスクリプトで使ってます)

## 編集中に気がついたこと

- 今まで使ってた`c$`は`C`だけでいい
- imapしておくとhtmlのエスケープでお世話になりそうだったので`<C-,>`,`<C-.>`,`<C-6>`あたりを定義しようと思ったら出来なかったんだけどというか、この辺にキーコードの割り当てがありませんでした。
  - というわけで短縮入力のトリガーになる`<C-]>`を使ってマップしてあげると捗りそうだったので…でも`<C-]><`,`<C-]>>`ってコンビネーション的にShift絡んでめんどいよね…

```vim:remap.vim
" 短縮入力用
" htmlのエスケープ
inoremap <C-]><Space> &nbsp;
inoremap <C-]>& &amp;
inoremap <C-]>< &lt;
inoremap <C-]>, &lt;
inoremap <C-]>> &gt;
inoremap <C-]>. &gt;
```

- Markdownの作表もこのノリでやれたらいいっすねってことで…

```vim:remap.vim
" Markdownの作表
inoremap <C-]>ll :--|
inoremap <C-]>cc :-:|
inoremap <C-]>rr --:|
```

- IMEのモードを指定して挿入モードに入るキーを作ると捗るらしいのでちょっと試しに追加しておいてみる。(`^^`は制御コード)

```vim:remap.vim
" IMEのモードを指定して挿入モードに入れないだろうか？
nnoremap <Leader>i i^^
nnoremap <Leader>a a^^
nnoremap <Leader>I I^^
nnoremap <Leader>A A^^
nnoremap <Leader>o o^^
nnoremap <Leader>O O^^
```

- 校正用キー作ったほうがいい

```vim:remap.vim
" 校正用
nnoremap <Leader>, i,<Esc>
nnoremap <Leader>. i.<Esc>
nnoremap <Leader>? i?<Esc>
nnoremap <Leader>! i!<Esc>
nnoremap <Leader>... i...<Esc>
nnoremap <Leader>/ i/<Esc>
nnoremap <Leader>\ i\<Esc>
nnoremap <Leader>,, i、<Esc>
nnoremap <Leader>.. i。<Esc>
nnoremap <Leader>?? i？<Esc>
nnoremap <Leader>!! i！<Esc>
nnoremap <Leader>/// i…<Esc>
```