開発環境で大事な物の一つがTextEditor。
昔からあるVimやEmacs、最近ではSublimeText、Atom、VisualStudioCodeといったモダンなエディタも台頭してきています。
そんな中で、僕が選択するエディタはVim。
なぜVimなのか、今回はVimの魅力を僕の観点でお伝えしていきます。
前提知識
Vimの魅力をお伝えするにしても、1からVimの解説をしたいわけではないので、最低限知っておきたい知識をあらかじめ書いておきます。
Vimにはモードという概念があります。
ノーマルモードでは、主にテキスト編集向けの操作ができます。ノーマルモードではテキスト入力はできません。テキスト入力をするには、インサートモードというテキスト入力用のモードに切り替える必要があります。
以上、前提知識でした。
Vimの魅力
Vimがなぜエディタとして魅力的か、要素を挙げていきます。
キーバインド
ノーマルモードで行うテキスト編集のキーバインドが良いです。
キーバインドの中でも特段重要なのが、最も使う操作の一つ、カーソル移動。これがVimでは[h,j,k,l]キーにアサインされています。ホームポジションに手を置いたまま、右手だけで快適なカーソル移動を可能とします。
矢印キーは遠いです。こんなに頻繁に使う操作を、ホームポジションから手を動かす必要があった状態から開放してくれます。Emacs系では、[Ctrl + p,n,f,b]でカーソル移動が可能ですが、押しにくいです。カーソル移動に両手を使うなんてナンセンスです。
その他にも、モードという概念があるゆえ、ノーマルモードで、単一キーで様々なテキスト編集操作が、ホームポジションのまま(CtrlやShiftキーを必要とせず)実行できる、多くのキーバインドがあるのがVimの魅力の1つです。
編集操作の選択 x 対象範囲の選択
先に挙げたキーバインドには、大きく分けて、「編集操作の選択」と、「対象範囲の選択」があります。Vimではこれらを組み合わせて、一つのテキスト編集操作を実行します。編集操作の選択がない場合は、対象範囲の選択はその範囲のカーソル移動になります。
わかりやすい例をあげてみましょう。(Vimではコピーをヤンクといいます)
yl → y:ヤンクという編集操作 x l:カーソル位置から一文字という対象範囲 = 一文字ヤンク
yw → y:ヤンクという編集操作 x w:カーソル位置からの1単語という対象範囲 = 1単語ヤンク
これが、yをdにするだけで、1文字削除、1単語削除。編集操作がないなら、1文字移動、1単語移動。
という具合に、「編集操作の選択」と「対象範囲の選択」をかけ合わせた数だけ、実行できるテキスト編集操作があるのです。
「編集操作」を一つ覚えれば、それまでおぼえた、対象範囲数だけできるコマンドが増えたことになります。逆も同じです。
できることが、おぼえたことの掛け算で増えていく。これは、論理的で効率的なテキスト編集操作だと思いませんか?
テキストオブジェクト
上で挙げた、「対象範囲の選択」のひとつにテキストオブジェクトという、対象範囲があります。
文字数、単語、行、というテキストそのものの単位区切り、ではなく、そのテキストが構成されている内容から対象範囲を決定する概念です。
簡単な例を見てみます。
void func(int arg)
{
anyprocess;
}
上のコードブロックで、
「int arg」つまり、「引数宣言全体」という単位を選択対象としたり、
「{ anyprocess; }」つまり、「ブレース括弧を含むブレース括弧範囲」を選択対象としたり、
といった、テキスト(コード)の構成に基づいた対象範囲選択が可能です。この構成に基づいた対象をテキストオブジェクトと呼びます。
これは、プログラムコード等を書いている際には、かなり強力な概念です。引数宣言をまるっと入れ替える、関数の中身をまるっと書き換える、HTMLタグの中身だけを書き換える・・など、プログラムで扱いたい単位で処理をできるのですから。
Vimに慣れてきたらまず使ってみてほしい機能の1つです。
マクロ
これまで見てきたとおり、Vimでは「編集操作の選択 x 対象範囲の選択」によって一つの編集操作=コマンド、が実行されます。これは、実際にテキストがどう編集されたかではなく、どのようなテキスト編集を意図したかがコマンドでラップされます。これにより、Vimでは1度行ったコマンドの再利用性があるのです。
例えば、dwというコマンドを実行した場合、「削除」を「1単語」行います。この1単語は3文字かもしれないし、5文字かもしれないし、10文字かもしれません。でもそれは関係ありません。どの単語でもdwで単語を削除できます。つまり、dwをというコマンドは、何度でもどこでも同じように使えるのです。
この考えを、さらに拡張したのがマクロです。コマンドの羅列を記録し、そのコマンドの羅列を再度実行します。
Vimでは、かなり手軽にマクロを記録し、即時実行することが可能です。
例えば、dwdwdwというように3単語削除したコマンドを記録してしまえば、3単語削除コマンドがあっというまにできあがったわけです。
この例はあまり意味のないものですが、
HTMLタグの内容を、開始タグ、終了タグ含めて書き換える、とか、
関数宣言の末尾に移動してconstを付与する、とか
よくありそうな編集操作をマクロとして記録して、他の箇所に速やかに同じ編集を適用することができます。
Don’t Repeat Yourself。コード編集は似たようなことの行っていることが多いものです。マクロを使えば、同じことを繰り返さずに、スマートなコード編集が可能となるでしょう。
拡張性
エディタを選ぶ際の基本として、拡張性があることは、一般的に重要であるとされます。使いやすいエディタを選ぶということは、自分でさらに使いやすくすることができることも重要であるということです。
この点でVimは、Vimscriptを用いたプラグインによる拡張が可能です。また、歴史も長く既にたくさんのプラグインが作られており、必要な機能の多くが既存のプラグインから見つけることが可能だと思います。
また、エディタの設定(Preference)もVimscriptによって行います。vimrcというファイルにVimscriptを直接記述して設定します。下手にGUIやjsonなどの設定ファイル形式になっていないので、自由度が高いです。単純な、タブ幅やフォントなどの設定から、テキストを開いたときに追加実行するコマンドの設定など、設定ファイルだけでも多くのことができます。
拡張性と設定の自由度、両方を兼ね備えたエディタであるといえます。
Vimのデメリットとは
ここまでVimの良い点をお伝えしてきました。これだけ良い点があれば、みんな使えばいいような気がしてきます。それにもかかわらず、誰しもがVimを使っているわけではありません。それにももちろん理由があります。
まず、モードという概念が、一般的なテキストエディタとあまりに異なる操作を強いるためです。キーボードを打てば文字が入力される、という常識が覆され、恐怖とともにそっとVimを閉じて2度と近づかなくなります。
次に、コマンドが豊富だが、覚えなければ使えない点。これも「一般的なテキストエディタと違うから」というのが理由の本質ではありますが、触り始めでおぼえることが多い印象になってしまうのは否めません。
次に、自由度の高いカスタマイズ性と引き換えに、設定のしやすいカスタマイズUIではない点。設定の変更やプラグインの導入にも、かっこいいGUIが用意されているわけではなく、自分で設定ファイルをゴリゴリ書くの基本です。モダンなエディタになれてしまうとこれがつらいと感じてしまう人もいるでしょう。
僕が思いつくのはこんなものです。ざっくりいってしまえば、初期学習コストが高いことと、便利なGUIなどはないことです。
その分、初期学習コストを乗り越えれば、それだけ快適かつ効率的なテキスト編集が可能となりますし、便利なGUIない代わりに多大な自由度のカスタマイズ性があるのです。そう考えると、当然のコストがあるだけ。Vimにデメリットなどないのです。(極論すぎる笑)
Vimのさらなる魅力を知る
今回は、約4年程Vimを使ってきた僕からみた、Vimの魅力的な特徴をお伝えしてきました。具体的なキー操作などは基本的にお伝えしておりません。そちらは、vimのヘルプ等をご参照ください。
そして、Vimには今回述べたこと以外にもまだまだたくさんの機能、魅力がつまっています。
それがわかりやすく書かれているのが以下の本です。
Vimの機能を以下に使いこなすか、網羅的かつ効果的に記述されていますので、一度見てみると参考になると思います。僕は2周読みました。
まとめ
というわけで、Vimのことをお伝えしてきましたが、本質としては、
自分の使いやすいエディタを、自分で納得して使いましょう
ということをいいたかっただけです。
もしこの記事で、Vimに興味の湧いた方がいれば少しずつでもVimmer初めてみてはいかがでしょう?
コメント