磯野ー！IDEにvim拡張入れようぜー！

# 初めに
筆者はvim初心者です。いじめないで‥
vimの操作方法に関しては以下の記事がとても素晴らしく、分かりやすいです。私には文才がないのでこれらの記事を読んだほうが‥

https://note.com/navitime_tech/n/nf6cae399ae75
https://wolfbash.hateblo.jp/entry/2017/08/25/121711

# vim拡張はいいぞ
なんたって作業効率が爆上がりします。どういうこと？と思う方がいるかと思われますが、例えば以下のようなコードに出くわし、```<p>```タグを中身ごと全て消したくなったとしましょう。

```html:hoge.html
<html>
<head>
    <meta charset="utf-8">
    <title>fuga</title>
</head>
<body>
    <h1>hogeでfugaでpiyo</h1>
    <p>aaaaaaaaaaaaaaaaa</br>
       aaaaaaaaaaaaaaaaaaaaaaaaaaa</p>
</body>
```

他のエディタであれば 「マウスに手を伸ばす」「範囲選択する」「再びキーボードに手を動かしdeleteキーを押す」という操作が必要になりますが、vimであれば```C-[ dat```と打つだけで全てが完了します。

コマンドを覚えるのが少しだけ大変ですが、せいぜい1,2週間で慣れるので心配はいりません。

# 謎の勢力「素のvimじゃないんだ（笑）」
素のvimもちゃんと設定すればそこらのIDEには負けなくなるらしいけど、そこまでの設定が結構大変らしいです。僕はまだその境地には至っていません。
一応現代のエディタに必須とも言える補完機能や定義ジャンプにLSP対応、果てはGitHub copilotまで使用可能とするプラグインもあるようですが、とりあえずvimのキーマップに慣れるだけだったら普段遣いのエディタやIDEにvimのプラグインを入れるだけでいいと思います。ワンクリックで設定出来ちゃうのがほとんどだしね。
慣れてきたらvim/neovimの広い世界へ飛び立ちましょう。

# そんな都合よくvimプラグインなんて転がってるかよ
都合よく転がってます。vimはどこにでもあるのです。emacsにもvimプラグインがあるくらいです。
Xcodeなんかはプラグインを入れなくても標準でvimモードが使えるようです。
以下は代表的なエディタやIDEのvimプラグインです。

VScode:

https://github.com/VSCodeVim/Vim

Jetbrains製IDE:

https://github.com/JetBrains/ideavim

SublimeText:

https://packagecontrol.io/packages/Vintageous

Atom:

https://atom.io/packages/vim-mode

Emacs:

https://github.com/emacs-evil/evil

# インストール終わったら早く使おうぜ
そうもいきません。vimは開いたらすぐに文字が打てるわけではないのです。

vimにはモードという概念があります。いくつかのモードがありますが、よく使うのはnormal modeとinsert modeの2つで、それぞれコマンド入力と文字の入力を担っているといえます。
vimを起動した時、デフォルトではnormal modeで始まるようになっています。normal modeでは入力する文字がすべてコマンド入力とみなされるので文字が打てないわけです。
これを解決するのは簡単で、```i```キーを押してinsert modeに切り替えればいいのです。逆にnormal modeに戻るためには```Ctrl```+```[```キーを押しましょう。

# vimの思想
「これじゃただの使いづらいエディタじゃないか」と思っているあなた、それはまだvimが何を目指して作られているエディタなのかを知らないからそう思ってしまうのです。

## じゃあvimの目指すところってなんなんだよ
それはズバリ、ホームポジション崩さずにできるだけ全てを操作することです。

他のエディタでは、例えばカーソルの移動時に矢印キーを押したりマウスに手が伸びたり、とにかく「ホームポジションから手を離して操作する」ことが多いのです。まあそれで満足ならいいんですが、僕からしてみれば無駄な動きの塊です。
vimにはこうした「ホームポジションから手が離れてしまう問題」を解決するためにnormal modeがあるのです。

つまりnormal modeが使えるように慣ればかなりvimのありがたさがわかるようになります。

## で、normal modeは何ができるの
まとめれば以下のような感じになります。

- カーソルの移動
- 指定範囲の削除
- 指定範囲のコピー
- ペースト

内容が膨大なので、ここではカーソル移動と指定範囲の削除だけサラッと紹介します。ここに関しては冒頭に挙げた記事がめちゃくちゃ分かりやすいのでそっちを読んでみてください。

### カーソル移動について
カーソル移動だけ取っても、矢印キーの一文字ずつ移動、みたいなしょうもない移動方法だけではなく、

- 一文字ずつ移動（```h```,```j```,```k```,```l```）
- 行末へ移動（```$```）
- 行頭へ移動（```0```）
- 前後の空行まで移動（```{```,```}```）
- 前後の単語に移動（```w```,```b```）
- 行内で一文字検索してそこまで移動（```f[任意の一文字]```など）
- 対応する括弧まで移動（```%```）
- 行を指定して移動（```[任意の行数]G```）

を始めとする非常に多くのバリエーションの移動方法があり、これらほとんど全ての操作が1回のキー操作だけで実現できます。他にもたくさんあります。
さらにvimには、これらの操作を行う前に数字を入れておくと、その回数だけその操作を繰り返すという機能があり、たとえば```3w```と打てば、3つ先の単語までジャンプすることが出来ます。

### 指定範囲の削除について
これにも非常に多くの機能・コマンドが含まれていますが、全てに共通するのはコマンドの最初が```d```で始まるということです。
```delete```の```d```と覚えましょう。

vimの範囲削除は実は非常に簡単・単純で、```d[削除したい範囲]```でいい感じになります。
範囲指定の方法に関しては指定範囲のコピーと全く同じなので、覚えてしまえば後は楽勝です。

範囲指定としては、以下のような物があります。他にもたくさんありますが。
- 単語（```aw```,```iw```）
- 段落（```ap```,```ip```）
- htmlタグ（```at```,```it```）
- ()、{}、[]の括弧の中（```i(```,```i{```,```i[```）
- ()、{}、[]の括弧自体とその中身（```a(```,```a{```,```a[```）

これも覚え方は簡単で、例えば単語であれば```aw```は```a word```、```iw```は```in word```となっています。
aとiの違いは、単語だけを削除するのか、その後ろの空白も削除するのかという点にあります。段落についても似たような感じで、iとaの違いはその後ろの空行を削除するか否かということだけです。

冒頭でhtmlタグを一つ消したいときには```C-[ dat```で事足りると言っていましたが、これは「insert modeからnormal modeへ移動」「タグを一つ削除（```delete a tag```）」という操作をしていたというわけです。

# 磯野ー！IDEにvim拡張入れようぜー！
という感じでした。ぜひvim拡張を入れて生産性を上げまくりまくりましょう。冒頭に載せた記事と同じですが一応おすすめのvim入門記事載せておきます。

https://note.com/navitime_tech/n/nf6cae399ae75
https://wolfbash.hateblo.jp/entry/2017/08/25/121711