Vim エディタってどうしてあんな操作なの？

# う～ん… Vim ってさぁ…

Vim エディタの入門を終え, とりあえず何とか編集できるようになったぐらいの人がまず思うであろう疑問.

* `a` や `i` を押して挿入モードに切り替えてから入力…
* `ESC` キーを押してコマンド受け付けるモードに切り替えて,
* v を押して範囲選択モードに切り替えて範囲選択したら d を押して切り取り,
* カーソルを動かして P で貼り付けて…

# どうしてこんな面倒なの？？？

vi エディタや, 特にその派生である Vim などは, 慣れるとかなり快適なエディタに化けます.
…が, 残念ながら多くの方が最初は「**面倒だ！**」と感じると思います.

たぶんそれは vi や Vim エディタの「根っこの考え方」が解らないからだと思います.

「i や a を押してインサートモードに切り替える」「Escape を押してノーマルモードに切り替えて云々」といった入門記事は世の中に溢れています.
しかし, これは仕組みの話でしかありません.
案外, 解説されていないのが「どうして, こんな UI になっているのか？」「どうすれば, この UI が快適と思えるのか？」の辺りだなぁと.

というわけで, エディタの歴史からひも解いて, 実際に使う際に個人的にはどう考えているか, vi / Vim エディタの根っこを捉えてみたいと思います.

**時間がない, 歴史なんぞどうでもいい** 人は、いきなり目次から **最後の 3 項目** だけ読んでしまっても構いません.

# エディタの歴史から見た vi / Vim エディタ

vi / Vim エディタの操作は, 元を辿ればより古いエディタの操作に由来していると思われます.

## ラインエディタの時代

かつてのエディタは, 今では現代で普通のエディタである「スクリーンエディタ」に対して **ラインエディタ** と呼ばれます. (当時はそんな分類はなく単に「エディタ」と呼んでいたことでしょう)

現代では旧式となってしまっているラインエディタですが, 一応生き残っているラインエディタもあります. 有名どころでは Unix 系の `ed` です.

<details><summary>ed を使ってみたい方は (折りたたみ文章を開くにはここをクリック)</summary>

> Unix / Linux / macOS などを使っている方であれば, もしかしたら既に入っていて, ターミナルを開いて `ed` と打って Enter 押したら起動するかも知れません. 無くても入手は容易だと思います.
> Windows の場合は, 特に定番は無いと思います…思いつくのは, Busybox に入っているものを使うとか, あとは各種 Linux 互換のコマンド環境に入ってたりするかも知れません. WSL が使えるなら, いっそ WSL からのほうが確実かも知れませんね.

</details>

ここでは ed の詳しい説明は省き, 説明に必要そうなところだけに留めます. 何せ歴史の長いエディタなので解説ページは Web 上に沢山残されています. `ed エディタ` とかでググったら出てくるのではないでしょうか (丸投げ)

## ラインエディタの根っこ

ラインエディタは Unix 系のシェルや PowerShell, コマンドプロンプトなどとよく似たインタフェースをしています.
つまり **1 行入力させる画面があって, コマンドと引数を並べて Enter すると実行される** というやつです.
多くのラインエディタにおいて, コマンドや引数の並べ方はシェルなどとちょっと違いますが, 基本的な考え方は同じです. **コマンドと引数** です.

また編集単位は「行」であり, 追記も削除も常に行単位です. 「現在行」の概念はありますが, それは行番号などの形で示され, 「テキスト内容に重ねてカーソルが表示されている」という形式ではありません.

## そしてスクリーンエディタへ

これに対して, 現代でもよくある:

* 画面上に表示できる限りテキストファイルの内容が常に表示されている
* その上に表示された「カーソル」を上下左右に動かす
* カーソル位置を中心に何らかの編集操作をする

というのはスクリーンエディタと呼ばれます. 今はこちらが単に「エディタ」と呼ばれますね.

vi の名は VIsual editor から来ていると言われています.
スクリーンエディタとしてはかなりの古株です.

## vi 系エディタがスクリーンエディタから引き継いでいること

さて上のような, ラインエディタに対して画期的な上のようなスタイルは vi で実装されたわけですが, 「命令をすることで編集する」というスタイルは vi ではそのままでした.
これは vi 系のエディタのひとつである Vim でも同じようになっています.

命令…つまり「コマンド」によって編集するのが vi 系エディタの考え方なわけです.
よくある, **カーソルを動かして, カーソル位置に文字を入力する. 特殊なキー操作で複雑な機能を呼び出せる** ではなく,
そもそも **カーソルを動かすのもテキストを挿入するのも, その他特殊なキー操作もすべてコマンド** なのです.

# モードなんて考えなくて良い

こういった歴史から, 自分の個人的に考える, Vim の操作に対する考えを書いていこうと思います.

Vim をはじめ vi 系エディタの解説としてよく「モード」の概念が出てきます.
「コマンドモードから `a` や `i` でインサートモードに入って編集を開始する」…ってやつです.

確かに vi 系エディタの【動作説明】としては正しいです. 設定に凝ったりするとどうしても出てくるので外せない部分でもあります.

ですが, 個人的には単に【使う】際には **まったく考えていません** 。
**すべてはコマンドモード** であり, その他のモードはあくまで **何かのコマンドの機能の一部でしかない** と考えています.

例えば `a` コマンドについて考えます.

* `a` キーを押下するとカーソル位置の直後に文字列を挿入することができます
* 挿入される文字列は `a` の直後から `ESC` や `Ctrl+[` の直前までで指定された内容です
* `a` の前に数値を指定していた場合, 指定された文字列がその回数分繰り返して挿入されます

この説明に「モード」という概念はひとつも出てきません.
確かに実際には挿入中に色々な操作が可能だったりするのですが, 例えばカーソル移動などは `ESC` で `a` コマンドを抜けてから, Vim の持つとても豊富なカーソル移動系コマンドで行なったほうが効率的ですのでまず使いません. 補完などは挿入中の操作として多用しますが, それもあくまで「挿入中に行えるちょっとリッチな操作」であって「モード」だとは認識していません.

# 実は, Vim はこんなエディタ

こう使っていくと, 色んなところが腑に落ちると思います.
実は Vim はこんなエディタなのです:

* とにかく常に **基軸に置くのはコマンドモード** であり, 他のモードは **何かのコマンドの一部に過ぎない** , ぶっちゃけ考えなくても使える
* すべては **コマンドモードに始まり, コマンドモードに戻って終わる**
* すべての操作 (**テキストの挿入も含む**) はコマンドである
* 実は他エディタに比べて **面倒なのは挿入だけ**
* 移動コマンドがめちゃくちゃ豊富
* `u` (アンドゥ) や `Ctrl-R` (リドゥ) の単位がどこなのか, コマンドモード基準だとしっくりくる
* `.` (「直前の編集操作」を繰り返す) は凄く便利
* マークは単なるブックマークじゃなく, **編集コマンドで範囲指定する際に *motion* として使える**
* 検索系…特に **1文字検索系のコマンド** は単なる検索じゃなく, やっぱり **編集コマンドで範囲指定する際に *motion* として使える**
* タブ, 分割などの定番機能やプラグインも **あります**

# Vim をもう一度やってみる

この辺りが解ってきたら, もう一度入門や, カテゴリ別の解説を読んでも良いですし,
何か「こういう操作ないかな？」と思う度に `vimindex` (Vim ヘルプの, コマンド一覧のページ) 内を検索するだけでも身についていくと思います.

特に `vimindex` については慣れてきてもよく引きます. 辞書みたいなものです.

上の辺りが解ってくると, あとは **いきなり極めるのではなく, ちょっとずつ** 使っていけばよいと思います.
さあ, もう一度 Vim をやってみませんか？