地獄のVimトレーニング(前半戦) - motion.txtを理解する

Vimを使う上での最大の壁である「モード」の存在を理解するためのエントリです。勿論超苦手な部分で、今までも2度ほど断念した覚えがあります。しかし今ならきっとなんとかなるんじゃないかなと思っております。そもそもVim習得を頑張ろうという理由が、名著[「実践Vim」](https://www.amazon.co.jp/dp/B00HWLJI3U)の「思考のスピードで編集しよう」というコピーライト[^1]なので、その肝の部分はきっとここなんだろうなと…

[^1]: 紙の本が好きなので買おうかどうしようか…

## トレーニング開始、とその前に

知り合いのVimmerにも言われたんだけど、とにかく「挿入モードでカーソルが動かせると思うな」と言われましたので、挿入モード中の<C-[hkjl]>定義を外しました。ついでにマウス操作も切ったのでもう逃げられません。さて、motion.txtを読んでいきましょう…一緒に見る方はお手持ちのVimで`:h motion.txt`をどうぞ。

### バカにしないでくれる!?知ってるわよそのくらい!! - 1. 移動とオペレーター

「とりあえず覚えろ」系のチュートリアルで「ヤンクは`yy`」とか「`ciw`は便利」とかそれだけは覚えたけどそれの意味までちゃんと分かっていませんでした。この辺の意味をちゃんと捉えないと本当にうまくは使いこなせないだろうなぁと思いまして、使いそうなやつだけピックアップしないとダメかなぁー

|キー|オペレーション|
|:-:|:--|
|`c`|変更する|
|`d`|削除する|
|`y`|ヤンクする|
|`gu`|小文字にする|
|`gU`|大文字にする|
|`g~`|大文字/小文字を入れ替える|
|`>`|インデントを上げる|
|`<`|インデントを下げる|

今はこれだけ分かってればいいかなぁ…必要なら調べればなんとか。
で、肝心な「オペレーションってなんぞや？」って話になるんだけど、「ビジュアルモードでは**選択した範囲**に、移動コマンドの接頭辞とした場合は**移動元と移動先の間を選択範囲として**オペレーションを行う」コマンドとのこと。例えばカーソルより先を編集し直すのであれば、`c$`とするわけだけど、これは"**c**hange to **end of line**"という感触で覚えてけばいいのかなって。つまり冒頭に出した`ciw`も"**c**hange **i**nner **w**ord"ということで、ちょっと捉えやすくなってきたなぁと。

### じゃあ先に覚えなくちゃならないじゃない！ - 6. オブジェクト単位で選択

多分viにはないから後ろの方の項目になったと思うんだけど、オペレーションと対になるオブジェクト単位の選択を覚えないことにはお話にならないのでそちらを先に確認します。

| |外側まで選択|内側まで選択 (**inner-**)|
|:-:|:-:|:-:|
|単語 (word)|`aw`|`iw`|
|文節 (WORD)|`aW`|`iW`|
|文 (Sentence)|`as`|`is`|
|段落 (Paragraph)|`ap`|`ip`|
|\[←の範囲→\]|`a[`|`i[`|
|(←の範囲→)|`a(`|`i(`|
|<←の範囲→>|`a<`|`i<`|
|{←の範囲→}|`a{`|`i{`|
|"←の範囲→"|`a"`|`i"`|
|'←の範囲→'|`a'`|`i'`|
|\`←の範囲→\`|``a` ``|``i` ``|
|&lt;tag&gt;←の範囲→&lt;/tag&gt;|`at`|`it`|

括弧関係は有効活用したいっすね…[surround入っとるわけだし](#vim-surround必要だわこれ。)。html書く時とか絶対便利そう。シビれますね。

### そもそも単語の移動ってちゃんと覚えてるわけ？ - 4. 単語単位の移動

うん、`w`,`b`くらいは知ってるけど…`e`?`ge`?ごめんちょっとまって今調べる…

|which|what|where|command|
|--:|--:|--:|:-:|
|先の|単語の|最初まで|`w`|
|||最後まで|`e`|
||文節の|最初まで|`W`|
|||最後まで|`E`|
|前の|単語の|最初まで|`b`|
|||最後まで|`ge`|
||文節の|最初まで|`B`|
|||最後まで|`gE`|

まとめてみればあまり怖いこともないのかな、ってところです。

### まだ見ぬ世界へ… - 5. オブジェクト単位で移動

で、これに気がついたときはちょっとシビれました。文/段落単位の移動なんてあったのね…

|what|where|command|
|--:|--:|:-:|
|文の|最初に|`(`|
||最後に|`)`|
|文節の|最初に|`{`|
||最後に|`}`|

うん、便利だと思うんだけど…文と文節の何がちゃうの？

…はい調べました。vimデフォルトでは日本語の句読点に対しては対応しとらんとのことなので、プラグインで対応しました。[deton/jasentence](https://github.com/deton/jasentence.vim)で対応できるとのことなので…これは必須っすね。

## 一旦休憩

正直、カーソルキー縛るのしんどいっす。その上で調べてることを実践してみて、分からなかったら更に調べて、改善できそうなら改善もして…ということをやってるわけで、相当時間かけてやってます。[後半に続く。](https://qiita.com/astrorobot110/items/a4313f971476bcd36909)

### ウオオオオオオオオアアアアアアアアアアアアアアアアア！！！！

[Vimモーション譜](https://qiita.com/kumazo/items/9d334256694c6253944a)
こういうのが欲しかったのよ！助かる！

## 編集中に覚えたこと

### vim-surround必要だわこれ。

```vim:vimrc
Plug 'tpope/vim-surround'
	:
	:
" vim-surround
" 上から順番に、l, L, 8, 9, ,(comma), .(period), *
let g:surround_108 = "「\r」"
let g:surround_76  = "『\r』"
let g:surround_56  = "（ \r ）"
let g:surround_57  = "（\r）"
let g:surround_44  = "＜ \r ＞"
let g:surround_46  = "＜\r＞"
let g:surround_42  = "**\r**"
```

### オペレーション以外で有能だったg絡みのコマンド

[Vim の g で始まるコマンドというかキーマップの一覧](http://h-miyako.hatenablog.com/entry/2015/01/31/185620#その他)
パクりに等しいレベルで[^2]めっちゃ参考にしました、ありがとうございます。

|コマンド|概要|
|:-:|:--|
|`gv`|前回の選択範囲を再選択する|
|`g&`|最後に実行した置換をすべての行で実行する|
|`g<`|前回のコマンド出力を表示する|
|`g<C-g>`|現在のカーソル位置情報を表示する|
|`ga`|カーソル位置の文字のアスキーコードを表示する|
|`g8`|UTF-8環境でカーソル位置の文字を16進数で表示する|

[^2]: というよりパクってます。ノートとして書き写すこと、書き写す中でVimの操作を行うことに意義があるので必然的にパクりが起こるんです、すいません。