地獄のvimトレーニング(後半戦) - motion.txtをより理解する

というわけで[昨日のエントリ](https://qiita.com/astrorobot110/items/4cce7b4871eb3b8fd341)の後半戦となります。なお、文章打ちながらヘルプを見るのがモード遷移の都合でとても億劫になったので[vim-jpの日本語ドキュメント](https://vim-jp.org/vimdoc-ja/motion.html)でヘルプを確認しています。

## 反復横跳び - 2/3. 左右/上下の移動

`hjkl`と`^$`に関しては今更なので省くとして、使わないと勿体無いやつをリストアップしておきます。

### `f`,`t`関係

正直スクリプトを殆ど書かないので強烈に恩恵があるわけじゃないんですけど、それでもvimスクリプトはなんとなく書き続けると思うので、そうなると強力なキーマップなんじゃないかなと、例えば今編集中だけど`` f` ``とか`f:`は多分役に立つのかなと

| |文字そのものまで|文字の手前まで|
|:--|:-:|:-:|
|先に|`f`|`t`|
|前に|`F`|`T`|

つまり、markdownの作表でパイプの後ろから`yf|`とかやれば、2行目のalign情報がヤンク出来るってことね…俺未だに`P`と`p`の挿入する方向ちゃんと把握してないんだけど役に立つんかな？更に、`;`で今の移動を繰り返し、`,`で今の移動の逆を繰り返しになる…これも作表には手っ取り早いのか。もしくはハイフン区切りで長いファイル名書いてから実はアンダースコアでしたみたいなやつに対して`f-` `r_` `;` `.`…うーん、すぐに思いつけなあさそうだなぁ。

### バッファ内の折り返しを汲んだ移動

`g[なんちゃら]`で器用に動いてくれるようです。

|移動方向|現在の行に|現在の画面上の行に|画面上の…|
|:--|:-:|:-:|:--|
|行頭に|`^`|`g^`|左端に|
|行末に|`$`|`g$`|右端に|
|次の行に|`j`|`gj`|一つ下に|
|前の行に|`k`|`gk`|一つ上に|

実際の`^`は、行の空白文字をインデントを考慮した行頭まで移動するのを忘れずに…そうじゃないときは`0`を使えるんだけど、なんかこれ古のドキュメントっぽいやつっすよね？今使い分けるかどうかって言うと微妙で…
その他に`gm`なんてコマンドもあるみたいだけどこれ使わなそう…

### その他記憶の隅に入れておいたら使い時が見つかるかもしれないやつ

|コマンド|概要|
|:-:|:--|
|`[0-9]%`|ファイルの[0-9]%の位置に移動|
|`[0-9]go`|ファイルの[0-9]バイト目に移動|

## 縦横無尽 - 7/8. ジャンプ/マーク

要はブックマーク出来るってことね…えっこれ大丈夫？なんかややこしくない？

|`m`コマンドから…|マーク|概要|
|:--|:-:|:--|
|マーク出来る|`[a-z]`|任意_(カレントバッファのみ)_|
||`[A-Z]`|任意_(バッファをまたぐ)_|
||`'`,`` ` ``|_ジャンプする直前位置_|
||`[`,`]`|**直前のオペレータコマンドの先頭と最後**|
||(ジャンプ時は)|**最後に変更/ヤンクされた部分の先頭と最後**|
||`<`,`>`|**直前のビジュアルモードの選択部分の先頭と最後**|
|マーク出来ない|`[0-9]`|viminfoファイルに記録されているvimを終了した位置|
||`"`|現在のバッファを最後に終了した位置|
||`^`|最後に挿入モードを終了した位置|
||`.`|最後の変更位置|

んでマーク先に飛ぶときは`'`が行頭、`` ` ``がマーク箇所そのものね。うん、便利そう。とりあえず[a-z]と[A-Z]は感覚的に分かる。例えば`ma`でマークして`` `a ``でジャンプね。便利、わかる。あとよくウィンドウで他のバッファ開いたりするから雑に`mA`するのは確かにいいね。で、マークの確認は`:marks`ね。他は、えーと…

### ジャンプする直前位置がなんでマークできるねん

それがどうしてかわからんのです…us配列だと確かに押しやすいんだろうけど…うーん。

### オペレータコマンドの…えっ？動くの？

動かせるみたいです。具体的に使い道が思いつかない…ドキュメントには「オペレータコマンドが複数のコマンドでシミュレートされるときに…」と書いてあるんだけどどういう状況なのこれ？さておきジャンプする方は超有能で、ビジュアルモードの選択に使えたりします。例えば`i`…`esc`,`v`,`` `[ ``…*前回surroundを入れてるので`S_`で…*
ビジュアルモードのマークに関してはもっと直接的に`gv`出来てしまうのを有効活用してもいいのかな？

### マークできない方は…普通だな

まとめてて使い方考える分には普通だなぁと思ったんですが、ドキュメント読んでる間に「`gi`で前回の挿入モード終了箇所から挿入出来る」、とか「`'.`より先に辿りたかったら`g;`を使え」とか…読む価値すげーありました。正直眠たくなってるんで雑になり始めてます。
ちょっとややこしいんだけど、オペレータコマンドのマークと逆の`['`,`` [` ``, ` ]'`,`` ]` ``が_直近の[a-z]のマークに移動出来る_とのことで、積極的にマークをつけていった方が良さそうっすね。ここで合わせて覚えたほうが絶対に良さそうなコマンドが`[(`,`[{`,`])`,`]}`の4つで、閉じられてない括弧にジャンプできるみたいです。
で、激しくジャンプするとカーソルが上端に行ったままとか、下端に行ったままになるんで、そのまま編集モード入っちゃったら`<C-x>`押してからの`<C-e>`と`<C-y>`でスクロールだけ出来るのでこれも活用っすね。

### 歴史を刻め

最後にちょっと触れた`g;`の履歴と、ジャンプリストに関して…

||変更リスト|ジャンプリスト|
|:-:|:-:|:-:|
|前に|`g;`|`<C-o>`|
|先に|`g,`|`<C-i>`|
|リストの表示|`:changes`|`:ju[mps]`|

個人的にはジャンプリストにすごく助けられそうで、何も考えずに別のバッファを開いてしまったときに`<C-o>`で戻れるのはすげぇ助かります。この更新中にも何度もやらかしてるんですよ…

とりあえず読み終わりました…追加することがあれば明日以降に。
終わり！閉廷！

## 編集中にわかったこと

### スクリプト中にバッファの最後に飛びたいのに…

~~理由はわからないままだけど`exec ':G'`やら`exec ':0g'`が使えないので、とりあえず正規表現で飛ぶのが一番簡単そうでした~~

[教えてもらいました。](#comment-2e2a663460339761bf3c)

```vim
norm G
```

### 出来ればノーマルモードでも空行入れたいなー

[vim-users.jpで見っけてきました](http://vim-jp.org/vim-users-jp/2009/08/15/Hack-57.html)

```vim
nnoremap <silent> <C-CR> <C-u>m`-$:call append(expand('.'),'')<CR>``
nnoremap <silent> <S-CR> :<C-u>call append(expand('.'), '')<CR>j
```

<NL>余ってたから上バージョンも作っておいたけど大丈夫かね…

## おたよりコーナー

[NERDTreeも要らないですよー](https://qiita.com/astrorobot110/items/10b7dd896c7921c2e05f#comment-f2b77205b5440611e5c5)

たしかにこれで十分そうなんでこの更新中にNERDTreeも契約破棄しました。これ最初から再帰でツリー開いて表示って出来んのですかね？