vim/gvimで特に使えると思っている機能とかキーとか

## 端書
ここ2～3年で、テキストエディタの世界はすっかりVisual Studio Code（VSCode）一強となりました。（このテキストを書くのに調べてみたら、VSCodeの初回リリースは2015年なんですね。もう少し最近かと思っていました。）

そんな中 癖の塊でしかないvim/gvim（以下、vi系）を使っていて、とても便利だと思った機能を紹介します。
基本的な使い方は 既に多くの方が記事を書かれているので そちらを参照してください。

## なぜvi系を使うのか？
### 始まり
セミナー（※1）に行った時、OSがLinuxで viをまったく使えませんでした。
「設定を変更して保存してエディタを終了する」ことすらできない悔しさ。
できないならトレーニングすればよい。そこからvi系を探していたところ、gvimに出会いました。

生真面目にマニュアル読みながら覚えようとして挫折すること2回。
「カーソルの移動」と「コピー（ヤンク）」「ペースト」「デリート」のみでとりあえず使い始め 今に至ります。


※1
確か、Azureがまだ弱々だった頃のPostgreSQLのセミナーでした。

### それでも有効性は高い
会社では ほぼWindowsしか使わないので、vi系知識が「必須になる」ことはありません。
ただ、OracleやPostgreSQLを使用する時、リリースタイミングと相互運用チェックと趣味でLinuxに構築することもあるので、意識せず使えるようになったvi系の知識は重宝します。

### そして便利に使えるようになる
使えば使うほどコマンドを覚えて便利に使えるので、VSCodeよりも使っています。
（つまりVSCodeも使っています。）
せっかくなので、いくつか紹介したいなぁ、と思い至りました。

## 機能：連番
### 概要
連番をつけたい場合、番号なしでテキスト作成してから番号をつけます。
### 手順
テキストを作成して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/69a9838b-904b-27ef-c1b8-01dbe7f74a3c.png)
`Ctrl+v`で矩形選択モードにして、カーソル移動（`Shift+g`でもOK）で最終行まで選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/e3b81ad3-9fd3-c379-882a-aba66772497f.png)
`Shift+i`→`1.`→`ESC`で左端に`1.`をまとめて設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/ff9f9cf5-63f8-ca7c-2079-8a856d4c8d38.png)
2行目以降の数値部分を`Ctrl+v`で矩形選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/1edcea99-ebda-600c-43f9-a42f77c1bb40.png)
**`g`→`Ctrl+a`** で連番になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/ee494797-fc31-326a-86fb-5e4d60cf64ec.png)
### 仕組み
`Ctrl+a`は自身を含め右側で一番近い数字のインクリメント。
これに`g`をつけています。
（`g`については後述します。）

## 機能：カーソル行以下削除（＝レジスタ保存）
### 概要
私のgvim使用用途は主に「下書き」であり、作成した文書は別のところに持っていく必要があります。
書き出しを一番下の行から行えば、この方法で 簡単に余す所なくレジスタに入れることができます。
### 手順
文書を作成したら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/1dd2ea4c-6c1c-397a-12f2-0e5343933e78.png)
書き出し部分に戻り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/df2385b2-ede7-cc3f-8c55-0e3fab43bd63.png)
**`d`→`Shift+g`**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/5926e0c0-d974-8bd2-0f71-49c30fe27446.png)
あとは必要なところに貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/7ffbe415-1cfb-1152-55a5-30c0c5c8eae7.png)
### 仕組み
削除（レジスタ保存）の`d`と、最終行への移動の`Shift+g`の組み合わせです。

## 移動キー：`{`、`}`
### 概要
段落移動できます。
目に見える範囲で移動できるので、`Cntl+b`や`Cntl+f`よりも使い勝手がよいと思っています。
### 動作
`}`を繰り返し押下した時の動作は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/1afc6ea3-939f-6713-56c9-ce929b6ef68e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/43e2cfdf-f3d1-b119-df3d-ae5e88506384.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/698769e6-77f9-322c-29a3-9edfcfb3d90d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/c014c267-30ce-2342-0813-24495e221d49.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554561/6a30ccc7-fbd6-24eb-d32a-0309e54d0a54.png)
`{`は上記の逆方向に動作します。

もちろん、他のカーソル移動系キーと同様、`d`,`y`,`v`との組み合わせも可能なので、「ブロックを切り取って移動する」などが簡単にできるようになります。

## 痒いところに手が届く`g`
`g`はちょっとした機能を提供してくれます。
表示上の行移動（`g`→`j`,`g`→`k`）、半角空白なしの行結合（`g`→`Shift+j`）、貼り付け後 貼り付けた最終行に移動（`g`→`p`）など。
今まで使っていたコマンドに`g`を付加すると結構面白いです。

## あとがき（今後）
何か良さげなものがあったら追記します。

## あとがき（雑談）
セミナーなどでノートPC のキーボードを使った時、vi系のカーソル移動は本当に便利だと感じました。
普段使いのキーボードは カーソルキーをホームポジションにマッピングしているので、そのあたりの利便性は気づきませんでしたが、ノートPCでNotepad使うと カーソル動かすだけでイライラしました。


## 参考
- [Vim — KaoriYa](https://www.kaoriya.net/software/vim/)
- [Visual Studio Code - Wikipedia](https://ja.wikipedia.org/wiki/Visual_Studio_Code)