Vimのキーストロークをどうやって覚えていったのか人生を振り返ってみた。

私はHTMLコーディングにもプログラムの記述にも、Vimを使うことが当たり前になりました。
通常のエディタを使うこともありますが、開発においてはVimのキーストロークをよく使います。
（今はQiitaの投稿フォームで書いてますが・・・）

昔からVimを使いこなせたわけではなく、すぐには覚えられませんでした。
お決まり？ですが操作が全くできずイライラしていたのを覚えています。
「そういえば、どうやって覚えていったのか」とふと思ったので駄文を書いてみました。

# 俺の歴史

## Lv.1: 大学時代、先生の説明が全く理解できずムカつく（笑）

OSが何なのか、PCかワークステーションかさえ忘れましたが、移動先の講義室に端末が置いてありました。
テキストにもviエディタの説明が載っていて、先生の説明からも「ノーマルモード」「コマンドモード」「挿入モード」という言葉が出てきました。
ただのワープロさえもろくに使えない時代にviのキーストロークなど、当然わけがわかりません。
そもそも打ったキーの文字が画面に出てこない時点で感情は限界に達していました。
多分、新規ファイルにノーマルモードで適当に打ってカーソルが何も変化しなかったのでしょう。

## Lv.2: 取引先のエンジニアにキーストロークをほんのちょっと指示される

何を血迷ったか、会社でサーバーを建てようとかいう話になりました。
当時3万円ほどの安いデスクトップにLinuxを入れようと。（Fedora Coreだったと思います。）
本を読んで勉強するも、設定ファイルがまったくさわれません。
画面を見てもらって「dd」とか「p」とか言われてました。
「dd」で一行消えたのですが、なぜそうなるかはこの時は全くわかりませんでした。
カーソル移動はカーソルキーでやっていました。

## Lv.3: ここからが本当の始まり。Viを覚えようと決意する。

ここまでは、Viを意図的に覚えようとはしていませんでした。
今の会社の社長がViを使いこなしているのを見て、これは覚えたら速いと思いました。
ここから覚えようと勉強を始めます。
Vimtutorを当時知りませんでした。
今は消えてしまったサイトですが、Viの基本の操作をわかりやすく解説しているサイトがあり、そこで書いている内容をViエディタで試していました。下記のような基本的なことが書かれていました。（原文は思い出せないので、原文ママではありません。）

> 「i」は現在のカーソルの前から挿入モードに入り、「a」は後ろから入ります。「i」と「a」は絶対に使い分けられた方がよいです。その他にも挿入モードに入る方法はたくさんあり、「I」で行の先頭、「A」で行の最後から挿入モードが開始されます。

こんな基本的なコマンドを少しずつ勉強していたのですが、まだ覚えているコマンドが少なく、普通のテキストエディタの方が効率がよい状態でした。
仕事で使いこなせるほどでもなかったのでDreamweaverや秀丸を使っていました。

- 「O」「o」「A」「I」を使えず、「i」で挿入モードに入りカーソルキーや改行を使って一行上や一行下を編集していた。
- ヤンクが思い通りに行えず、マウスで範囲選択してペーストしていた。
- ビジュアル設定も全く使えない（秀丸の矩形選択は使えていたのに）
- :%s（substitute）は知っていたが、特殊文字を反映できずDreamweaverに頼っていた
- 「/」は使っていたが、移動手段としては積極的に使えなかった。

## Lv.4: 検索の「/」、1単語の変更「cw」、最後の検索ワードに移動する「n」、繰り返しの「.」の活用で、便利さを初めて実感する

検索ワードの部分的な置換です。
一括置換をできないとき、今まではマウスで範囲選択してペーストすることで内容を置き換えていました。
これだと1文字余分に貼り付けてしまったり、クリップボードの範囲選択を間違ったりと、タイポの元になっていました。
これをViキーバインドで対処すると、正確で速かったのです。
スピードアップは期待していましたが、正確な編集ができることも知りました。

またこのとき、Eclipseを開発用エディタとして使用していました。
プラグインを入れてViキーバインドを使えるようにしていたのです。
このあたりから、開発用のメインエディタはViキーバインド必須と思うようになります。
開発効率も「Vimキーバインド > 通常のキーバインド」と逆転しました。

## Lv.5: マクロ「qa」の威力に感動

Vimのキーストロークを記録して「@a」だけで再現するマクロです。
すべての変数に「$this->」をつけて、行末に「// 〜」とコメントを入れる。。1行1行やっていると時間がかかります。
プログラマーとしてはあらゆるものを自動化させたいと思うのは自然なことで、便利さを充分に実感できました。
キーストロークを間違って思いもよらない編集になることもありますが（今でもあります）、プログラマーとしての頭の使い所でもありますし、編集のスピードと正確性は数倍になることもあります。

ちなみにマクロを覚えた当初は「qa」で記録開始することが多かったのですが、今は「qq」で始めることが多いです。

## Lv.6: Sublime Textの導入で、（Viキーバインドを持たない）Dreamweaverに別れを告げる

当時、開発用のメインエディタを探してさまよっていました。
ネットで調べてみると、特にデザイナー界隈で人気が急上昇していたSublime Textに出会います。
操作性、デザイン、軽さなど、魅力的な点は多かったのですが、一番気に入ったのは「Viキーバインド対応」でした。
ここからしばらく開発用のメインエディタとなります。
（余談ですが後にATOMに乗り換え、さらに後にVSCodeに乗り換えました。）

純粋なVimの話ではなくなりますが、Sublime Textは複数箇所の範囲指定ができます。
複数箇所の範囲指定をした状態で、Viキーバインドで編集を始めることもよくやります。

今まではHTMLコーディングにDreamweaverを使っていました。
Sublime TextはHTMLの編集も非常にスムーズで、Viキーバインドが使えるようになったため、長らく愛用してきたDreamweaverに終止符を打ちました。

## Lv.7: 「実践Vim」を読んでVim力が超絶UP！

「実践Vim」という書籍がネットで評判がよいので、買って読んでみました。
確かに超絶良書でした。
プラグインの説明ではなく、通常のコマンドの説明ですが、本当に勉強になったのは、書かれている「考え方」です。
「実践Vim」について得られた考えについては過去に投稿しています。

- [「実践Vim」を読んで得られた考えをまとめてみた1（ドットコマンド・ノーマルモード）](http://qiita.com/sfp_waterwalker/items/822bdcccb1b31f4b82ad)
- [「実践Vim」を読んで得られた考えをまとめてみた2（挿入モード・ビジュアルモード）](http://qiita.com/sfp_waterwalker/items/7558e80b0a7f6b36019e)
- [「実践Vim」を読んで得られた考えをまとめてみた3（コマンドラインモード）](http://qiita.com/sfp_waterwalker/items/22f30277de14fbb4ec4f)

## Lv.8: ビジュアル範囲設定（矩形選択）を使えるようになる

行指向の範囲指定（shift+v）はすでに使っていました。
このときに使いこなせるようになったのは矩形選択（ctrl+v）の習得でした。
行頭に文字を追記したりビジュアル範囲指定でヤンクした内容を行頭にプットしたりと、便利に使っています。

## Lv.9: グローバルコマンドとノーマルコマンドを活用開始

- 各行に対して編集処理を行えるグローバルコマンド
- コマンドラインモードでノーマルモードのキーストロークを実行できるノーマルコマンド

それぞれが非常に強力です。組み合わせるともっと強力です。
ノーマルモードのキーストロークは

```
:norm @q
```

というようにマクロも設定できるので、 

```
:%g/^/norm @q 
```
こんなこともできたりします。

# 歴史を振り返ってみて

とにかく敷居の高いエディタでした。
学習コストが高いと言われますが、本当だと思います。
一方でこれもよく言われますが、一度覚えてしまうと作業効率が跳ね上がります。
使い手の経験や技量が効率に現れます。
私の場合は、最初に全部覚えていきなり最高効率で使いこなせるようになったわけではありません。
少しずつ覚えて、今ようやくこのあたりです。
まだ使っていない、もしくは使いこなせていない機能もたくさんあります。
それでも1つ覚えると、編集速度が数倍になることも珍しくありません。
ある程度の学習時間が必要ですが、プログラムやhtmlを書くのにオススメできます。