Vimを一ヶ月使った感想

# 前書き

Vimについてずっと勉強したかったのですが、
最近にやっと勇気を出てキャッチアップして、
VSCとIdea両方にVimのプラグイン・エクステンションを入れて、
一ヶ月Vimのみのプログラミングを挑戦してみました。

結論を先に言いますと、
最初は確かにいろいろ苦労したけど、
でも使えば使えるほど手ごたえを感じていて、
「めっちゃ便利だ！」というレベルほど上手にはなってないだけど、
これからずっとVimを利用して開発してもそんなに抵抗感がないなぐらいの実感です。

今回の記事では、
自分がこの一ヶ月間でVimを使ってみて、
どんなコマンドを一番使っているか、
統計的にな意味合いで「どんなコマンドからVimを勉強すればよいか？」、
のヒントやアドバイスになれればいいなと思います。

## カーソル動く系

### 使用頻度（高）：hjkl

- h：←
- j：↓
- k：↑
- l：→

最初はちょっと「どれがどれだっけ」を考えながらやってたんですが、
一ヶ月も経ったので、
今は思わず自由自在に←↓↑→をコントロールできます。

### 使用頻度（高）：w

`l`で文字ごとに一個一個右に移動させるのはだるいので、
`w`が方が早いですね。

単語毎にカーソルを右方向に移動させる。

### 使用頻度（中）：e

基本的に`w`を使う場合が多いのですが、
`w`で行き過ぎた場合に、`e`を使います。

単語ごとに単語の最後の文字に移動させる。

### 使用頻度（やや高）：b

`w`の逆ですが、`h`で一個一個移動させるのもだるいので、
だるいと感じたら`b`を使い始めるイメージです。

単語ごとに前の単語に移動させる。

### 使用頻度（中）：gg と G

ログを見るときとか、一番下の行に何かを追加した場合に、gg/Gを利用する場合がありますね。

- gg: 一番上に
- G：一番下に

### 使用頻度（中）：数字G

特定の行に行きたい場合にこれを使います。

でも大体のIDEは`Ctrl + G`で同じ機能をサポートしているので、
`Ctrl + G`を使った方が便利の気がします。

> でもVimのエクステンションやプラグインを入れる場合に、元の`Ctrl + G`が使えなくなるので、
> 手動でVim側の`Ctrl + G`を外す必要があります。

### 使用頻度（中）：{ と }

`jjjjjjj`をずっと打つことも面倒くさいし、`10j`とか`42j`とかもあるけど、
`{`と`}`はやはりたまに使います。

段落ごとにカーソルを移動させる。

- {：上の段落
- }：下の段落

### 使用頻度（中）：N / n

前・次の検索結果に移動させる。`.`と併用する場合が多いです。

- N：前に
- n：次に

### 使用頻度（中）：0w

これは便利かもしれませんが、ちょっと`0`が若干遠いので
行の先頭の単語に移動させる。

> もし先頭に空白が存在していない場合に、`0`だけで十分です。

```js
if (a) {
  const b = 42;
  //    ↑ cursor is here
}

// 0wを押した後

if (a) {
  const b = 42;
//↑ cursor will go to here
}
```

`I` + `Esc` + `l`と一緒。

### 使用頻度（中）：-

一個上の行の先頭（空白を全部飛ばす）に移動させる。

```js
if (a) {
  const b = 42;
  //    ↑ cursor is here
}

// -を押した後

if (a) {
↑ // cursor will go to here
  const b = 42;
}
```

```js
if (a) {
  const b = 42;
  const c = b + 1;
  //    ↑ cursor is here
}

// -を押した後

if (a) {
//↓ cursor will go to here
  const b = 42;
  const c = b + 1;
}
```

### 使用頻度（高）：*

カーソル下の文字を検索できます。
特に関数や変数に遷移したい場合に結構便利ですね。

```js
//     ↓ cursor is here
const foo = () => {};
foo();

// *を押した後

const foo = () => {};
foo();
↑ // cursor will go to here
```

**`-`と`*`は@Pseudonymさんの提供です、ありがとうございます!**

### 使用頻度（中）：$

行の最後に移動する場合に、基本的に何かを挿入したいケースが多いので、
`A`を使う方がおおですね。
また`$`を使いたい場合でも、`A` `Esc`を使う場合が多いです。

カーソルを行の最後に移動させる。

### 使用頻度（中）：t文字 / f文字

- t文字：文字の一個前のポジションにカーソルを移動させる。
- f文字：文字のポジションにカーソルを移動させる。

```js
const a ='hello world'
//    ↑ cursor is here

// tlを押した後

const a = 'hello world'
//          ↑ cursor will go to here
```

```js
const a ='hello world'
//    ↑ cursor is here

// foを押した後
const a = 'hello world'
//             ↑ cursor will go to here

// もう一回fo
const a = 'hello world'
//                ↑ cursor will go to here
```

> ヒント: なるべく頻度の低い文字でジャンプ。これで操作の回数を減らせます。

## モード切り替え

### 使用頻度（高）：Esc

なるべくINSERTモードを入らないように、
何かをインプットした後に、すぐ`ESC`を押す習慣ができました。

**基本的にNORMALモードにするべきです**。

### 使用頻度（高）：i

それはそうだね、何かを挿入したいときに、`i`でINSERTモードに入るわけですね。

### 使用頻度（中）：I

カーソルを行の先頭に移動させ、INSERTモードに入る。

`0i`と一緒。

### 使用頻度（やや高）：a

`i`とちょっと似ているのですが、たまには`a`と`i`を使い分けられると気持ちが良くなります。

カーソルの一個後ろの文字にINSERTモードに入る。

`i→`と一緒。

### 使用頻度（中）：A

これはあまり目立たないだけど、以外と高い頻度で利用しています。
行の最後にカーソルを移動させ、INSERTモードに入る。

`$a`と一緒。

### 使用頻度（高）：o

改行したいときに、新しい行を追加したい場合とか結構あるので、
よく活用しています。

`A`+`Enter`と一緒。

### 使用頻度（中）：O

たまには前の行に何かを挿入したい場合にこれを使いますね。

`kA`+`Enter`と一緒。

## NORMALモードのままの操作

### 使用頻度（高）：dd

行を削除することが結構あるので、めっちゃ使っています。

現在行を削除する。

### 使用頻度（やや高）：D

これも以外と使っています。
特に`=`にカーソルを移動させて、`D`で`=`の右側を全部削除するとかのケースの場合。

```js
const a = 'some string here';
//         ↑ cursor is here

// Dを押した後

const a = '
// 上記になる
```

現在のカーソルの右側全てを削除する。

`d$`と一緒。

### 使用頻度（高）：dw

これは一番使われるケースなので、当然：高です。
単語一個削除する。

### 使用頻度（高）：dt文字 と df文字

やっぱり`dwdwdwdw`は面倒くさいと思う時があるので、
例えば：

```js
const greeting = 'Hello World!!';
// cursor is here ↑

// dwdwdwを押した後
const greeting = '
```

```js
const greeting = 'Hello World!!';
// cursor is here ↑

// dt'を押した後
const greeting = '';
```

```js
const greeting = 'Hello World!!';
// cursor is here ↑

// df!を押した後
const greeting = '!';
```

ちょっと練習が必要ですが、
慣れてしまうと意外と使いやすいです。

- dt + 文字: それぞれ特定の文字まで
- df + 文字：特定の文字（含む）まで

を全部削除する。

### 使用頻度（やや高）：C

`D`と似ていますが、現在のカーソルの右側全てを削除する。また、INSERTモードに入る。

`Da`と一緒。

### 使用頻度（高）：cw

特に変数の名前を変更したい場合によく利用してます。
`dw`と似ていますが、現在の単語を削除して、INSERTモードに入る。

`dwi`と一緒。

### 使用頻度（やや高）：ct文字 と cf文字

`dt`と`df`と似ているのですが、該当の単語を削除してINSERTモードに入る。

### 使用頻度（中）：v

まあこれが便利ですが、何かを選択して次にコピーとか、削除とか、修正とかしたい場合に利用することが多いですが、
私はあまり利用していないですね。

VISUALモードに入る。

### 使用頻度（高）：V

意外とこれがよく使っています。
行ごとに選択する。

例えば複数行を削除したい場合に、
私は`dddddd`で三行を削除するのではなく、
`Vjjd`を利用することが多いですね。

なんか何かを選択してから操作するのほうが安心ですね。

### 使用頻度（高）：.

よくある利用例としては、`cw`で単語を変更しました、
別のところの同じ単語があれば、それにフォーカスして`.`を押すと、
その単語も同じように変更できます。

一個前の操作をリピートする。

`dddddd` = `dd..`

### 使用頻度（中）：~

変数名のcamelCaseがちゃんとなっていない場合にこれを使います。
わざわざINSERTモードに入って、削除して、新しい文字を入力して、とかの操作をしなくても済むので。

大文字・小文字に変更するコマンドです。

### 使用頻度（中）：/キーワード

`Ctrl + F`と同じイメージですね。
IDEの`Ctrl + F`は便利なので、あまり`/`を利用していないですが、`.`と併せて利用すると以外と便利です。

例えば：
`n` -> `.` -> `n` -> `.`。
というイメージで、次にマッチした文字列に行って操作をリピートする、また次に行って操作をリピートするとかです。


### 使用頻度（高）：x

`dw`でうまく意図通りに削除してくれない場合に、`xxxx`を連打します。
連打にストレスを感じたら、`v`でVISUALモードに入って削除したい文字列を`w`と`l`を併せて選択して削除しましょう。

### 使用頻度（高）：u

誰だってミスするのでこれは高でしょう。
一個前の操作を取り消すコマンドです。

### 使用頻度（高）：Ctrl + r

誰だってミスをさらにミスするのでこれも高でしょう。

`u`の操作を取り消すコマンド？たぶんそういうイメージです。

### 使用頻度（中）：s

`cw`を使うケースが多いので、`s`をあまりって感じですね。
カーソルの文字or選択した文字列を削除してINSERTモードに入る。

### 使用頻度（中）：yw

たまには単語をコピーしたいですが、
でもちょうど単語にフォーカスしていないと、わざわざ単語にカーソルを移動させるのも面倒くさいので、
あまり利用していないですね。

単語をコピーする。

### 使用頻度（高）：yy

これは結構利用しています。
一行をコピーする。

### 使用頻度（高）：p

正しくペーストするためにカーソルのポジションを正しくなってないと、
ペーストが意図通りにならないことをさんざん経験しました。（単語の最後の文字以前にペーストしてしまったとか）
皆様同じような悩みがありますかね？
コピーしたものをペーストする。

```js
// コピーした文字列：world
const a ='hello'
//             ↑ cursor is here
const a = 'hello'world

//pを押した後

const a ='hello'
//            ↑ cursor is here
const a = 'helloworld'
```