最近、VimやNeovimを触っていて、なぜ自分がモーダル編集に惹かれるのかを考えていました。
最初は、Vimそのものが好きなのだと思っていました。
しかし、どうも少し違うようです。
欲しかったのはVimというエディタではなく、「モーダルに編集する」という操作方法そのものなのかもしれません。
普通のエディタでは修飾キーを多用する
一般的なエディタでは、文字キーは文字入力のために使われます。
そのため編集操作には、CtrlやShift、矢印キーなどを組み合わせる必要があります。
たとえば、
- Ctrl+Cでコピー
- Ctrl+Vで貼り付け
- Shift+矢印で選択
- Ctrl+矢印で単語移動
- DeleteやBackspaceで削除
といった操作です。
もちろん、これでも問題なく編集できます。
ただ、長時間使っていると、CtrlやShift、矢印キーなどへ頻繁に指を動かすことになります。
そこでVimのモーダル編集です。
Normalモードでは文字を入力しない代わりに、文字キーそのものを編集操作に使えます。
h j k l 移動
v 選択
y コピー
p 貼り付け
d 削除
w 単語移動
どれもホームポジション付近にあります。
高速だから便利というより、普通の文字キーだけで編集できること自体が楽なのです。
そもそも「編集」はコマンドとは少し違う
ここで、以前使っていたedのことを思い出しました。
edでは、編集もコマンドとして実行します。
3,5d
10p
s/foo/bar/
何行目を対象にして、何をするのかを指定する。
これはシェルコマンドにも似ています。
grep foo file
cp a b
rm file
対象と処理を指定して実行する、という考え方です。
ところが実際に文章やコードを編集していると、少し違った操作をしています。
「ここまで移動する」
「いや、もう1文字右」
「ここから選択する」
「もう1単語先まで選択する」
「削除する」
「やっぱり戻す」
「少し書き直す」
「別の場所へ移動して貼り付ける」
このように、編集では現在位置と状態を維持しながら、小さな操作を連続して行います。
一つの命令を与えて結果を得るコマンドとは、少し性質が違います。
viは「編集」に専用の操作体系を与えた
ラインエディタからviへと続く流れを考えると、この違いがよく分かります。
edでは、編集対象を行番号などで指定してコマンドを実行する性格が強くあります。
一方、viでは画面上にカーソルがあります。
そのカーソルを動かしながら、
h
j
k
l
w
b
d
y
p
と、小さな操作を次々につないでいきます。
つまり、
edでは「編集をコマンドとして指定する」性格が強い。
それに対して、
viでは「対象の中を移動しながら直接編集する」操作が前面に出ています。
viはラインエディタの流れを単にフルスクリーン表示へ拡張しただけではなく、「編集」という行為に適した操作体系を前面に押し出したと見ることもできます。
モーダルはキーボードに二つの意味を持たせる
では、なぜモードが必要なのでしょうか。
理由は単純です。
キーボードには限られた数のキーしかありません。
文字を入力しているとき、
d
は当然「d」という文字です。
しかし、編集するときまで、dを文字入力のために予約しておく必要はありません。
Vimはここを分けました。
Insertモードでは、
d = 文字「d」
Normalモードでは、
d = delete
になります。
つまりモーダルとは、一つのキーボードに「文字入力用」と「編集用」という二つの意味を持たせる仕組みとも考えられます。
これによって、CtrlやShiftとの組み合わせに頼らなくても、多数の編集操作を普通のキーに割り当てられます。
Vimのすべてが必要なわけではない
自分が必要としているのは、Vimのすべてではありません。
編集作業で頻繁に行っていることを考えると、
移動
選択
コピー
貼り付け
削除
このあたりが中心です。
これらをホームポジション付近のキーだけで操作できれば、それだけでもかなり快適になります。
そう考えると、自分が欲しいのは必ずしもVimそのものではないのかもしれません。
たとえばVSCodeのような現代的なエディタに、簡単な「編集モード」があったらどうでしょうか。
普段は普通のエディタとして文字を入力する。
編集するときだけEscなどを押して、
h j k l 移動
v 選択
y コピー
p 貼り付け
d 削除
を使う。
文字を書きたくなったら通常の入力状態に戻る。
これだけでも、モーダル編集のメリットの一部は得られそうです。
モーダル編集はVimだけのものではないのかもしれない
現在、モーダル編集といえばVimが代表的です。
そのためモーダル編集を使おうとすると、「Vimを覚える」という話になりがちです。
しかし、Vimとモーダル編集は分けて考えることもできます。
だからといって、現在のエディタの操作をモーダルに置き換える必要はありません。
VSCodeのような現代的なエディタには、すでに便利な操作がたくさんあります。
文字を入力すれば、そのまま入力できる。
マウスも使える。
矢印キーも使える。
Ctrl+CやCtrl+Vも使える。
コマンドパレットやGUIも使える。
これらを残したまま、必要なときだけ簡単な編集モードを使える形も考えられます。
つまり、Vimの操作体系をそのまま再現するのではなく、モーダルという仕組みだけを追加するという考え方です。
重要なのは、
「編集するとき、文字キーを編集操作として使える」
という部分です。
たとえばVSCodeなら、現在の操作体系を残したまま、その上に簡単な「Edit Mode」があっても面白そうです。
Vimを知らない人は、今まで通り使える。
モーダル操作が楽だと感じた人だけ使う。
そうであれば、モーダル編集について詳しく理解してから使い始める必要もありません。
使ってみて楽なら使う。
そのくらい自然な形でモーダルという仕組みが存在してもいいのかもしれません。
エディタはコンピュータ操作の基本にある
なぜ、こんなことが気になるのでしょうか。
おそらく、編集という行為がコンピュータを使ううえで非常に基本的だからです。
文章を書く。
コードを書く。
設定ファイルを書く。
既存の文章を書き換える。
コピーする。
移動する。
削除する。
コンピュータを使っていると、私たちは常に何かを編集しています。
シェルやプログラミング言語では、「処理する」ための方法が長い時間をかけて発達してきました。
同じように、「編集する」という行為にも、それに適した操作体系があるのではないでしょうか。
その一つの答えが、viやVimのモーダル編集だったのかもしれません。
まとめ
Vimを使っていて面白いのは、単に操作が速いからではありません。
文字を入力するときと、既存の文字を編集するときを分離し、文字キーを入力と編集のそれぞれに使い分けられることに大きな意味があるように感じます。
考えてみれば、
入力と編集は別の行為です。
それなら、操作体系が分かれていても不思議ではありません。
そして、それは現在のエディタの操作体系を捨てるという意味でもないと思います。
現代的なエディタの操作を残したまま、必要なときだけモーダル編集を使う。
そんな形もあり得るのではないでしょうか。
Vimそのものが今後どうなるかは分かりません。
しかし、モーダルという考え方自体は、Vimというエディタから切り離して考えることもできます。
将来、Vimとは関係なく、一般的なエディタにも自然な「編集モード」が搭載されるようになるかもしれません。
そう考えると、「編集」という行為のインターフェースには、まだいろいろな可能性が残されているように思います。


コメント