追悼 Bram Moolenaar
~Vimへの情熱と貢献を振り返る

Bram Moolenaar the Creator of Vim

2023年8月5日、悲しい知らせが入ってきました。長年、多くのエンジニアに愛され今もなお使われ続けているテキストエディタVimの作者Bram Moolenaar氏が同月3日に亡くなったという知らせです。ショックでしばらく信じることができませんでした。

筆者は長年Vimを使い、Vimに多くのコントリビュートを行ったり、その都度Bram氏と対話したり議論したりしてきました。そのBram氏が突然、この世界からいなくなってしまったことをしばらく受け入れられなかったからです。

本記事では追悼の意味を込め、Bram氏がどのようにVimの開発を始め、Vimがどのように広まっていったのか、また長年Vimを追い続けてきた筆者から見たBram氏の人物像を筆者の思いを交えて解説していきます。

Vimの歴史

Bram氏についてお話しする前に、まずはVimがどのようにして誕生したのかについてお話しします。

VimVi IMproved)はviの上位互換ソフトウェアです。viはアメリカのコンピュータ科学者でありコンピュータ技術者であるBill Joy氏により、1976年に開発されたテキストエディタです。viはexというラインエディタをベースに作られたスクリーンエディタで、exコマンドを使った編集操作と、特殊なキーボード操作でカーソルを移動させる、ちょっと変わったテキストエディタです。ですがその生産性の高さからこれまで多くのUNIXエンジニアに愛され使われてきました。筆者もその1人です。

ある日、Amigaと呼ばれるパーソナルコンピュータを買ってきたBram氏は、このコンピュータ上でviを使えるようにしたいと思い、移植を始めました。1980年代の終わりのことでした。これがVimの開発の始まりです。

1980年代、すでにたくさんのviクローンが出回っていました。nviやstevieやelvis(jelvis)やvileなどが有名です。Bram氏はその中のstevieをベースにVimを開発していきました。筆者もstevieを触ったことがありますが、とても安定した良いviクローンでした。

Vimは1991年に一般公開されました。そしてその後30年にもわたって開発が続けられるとても有名なOSSとなりました。

Vimは数多くのプラットフォームに移植されました。Atari MiNT、BeOS、DOS、Windows、IBM OS/2、OS/390、MorphOS、OpenVMS、QNX、RISC OS、UNIX、Linux、BSD、Mac OS、Mac OS X、最近ではAndroidやiOSにもVimが移植されています。viを模倣するのではなく、Vimを模倣する物まで登場しました。

そして今やVimはまるでviを意味するかのように呼ばれ、さらにはh j k lキーでカーソル移動できるユーザーインターフェースは「Vimキーバインド」と呼ばれるほどになりました。

これほどまでにVimが人気のテキストエディタになった理由は何だったのでしょうか。Vimはviクローンでありながら、開発時に求められている機能を積極的に取り込んでいました。たとえば、⁠マルチウィンドウのサポート」「Vim script によるシンタックスや設定のカスタマイズ」⁠プラグインシステム」といった機能は、Vimから新規に追加されたものです。

これらの機能を積極的に取り込み、そして開発を止めなかったことがVimをこれほどまで人気にさせた理由と筆者は考えます。

Bram Moolenaar氏の活動

Vim

Vimの開発はほかのOSSプロジェクトに比べて特殊です。すべてのコミットはBram氏のみによって行われます。今でこそGitHubを使うようになりましたが、昔は6.1.22といったバージョン名が付けられたパッチファイルが変更セットの単位で作られ、vim-devのメーリングリストやFTPサーバから配信されていました。ですのでBram氏はすべての変更に対してレビューを行っており、またほかの開発者からもらったパッチを自分なりに解釈して修正したうえで、Bram氏にとって最善の形でVimに取り込んでいました。

かつてのVimのコードホスティングサービスは、CVS、Google Codeと移ってきましたが、2015年8月、Google Codeがサービス終了することに伴ってGitHubへと移されました。これを機に、Vimの開発もGitHubでPull Requestを送るとマージされる一般的なOSSの開発手法に変わるのではないか、とVim開発者のみなは期待しました。しかし、実際はそれまでと変わらず、送られてきたPull Requestの内容をBram氏が自分なりに解釈し、それをもとに自らコミットを作成してmasterブランチにpushするという方法が採られました。これについてはいろいろな意見がありましたが、普段から自分のスタイルを崩さないBram氏らしい判断だなと筆者は思いました。

Bram氏のGitHubリポジトリにはVimに関連する物しか置かれていません。また、GitHubのBram氏の活動内容を見ると、ほぼVimのみにコミットしているのがわかると思います。Bram氏の活動のほとんどがVimに注ぎ込まれたのです。

なおVimのリポジトリがGitHubに移されたのは2015年でしたが、過去の履歴から復元し2004年(バージョン7.0)からの履歴がGitHubのリポジトリ上に再現されています。残っているだけ(手作業でパッチファイルを作っていたころを除く)でも16,566個ものコミットをBram氏1人が行ったことになります。まさに鉄人です。

そんなBram氏にも、Vim以外の活動がありました。

Zimbu

ZimbuはBram氏が開発していたプログラミング言語です。2009年ごろに開発されたもので、本記事を執筆している時点ではすでにドメインがなくなってしまっており、ソースコードリポジトリもなくなってしまっていることから、すでに試すことはできなくなってしまいましたが、おおよそコード1のようなシンタックスを持つ言語です。

コード1 Zimbuで書かれたFizzBuzz
FUNC int MAIN()
  FOR i IN 1 TO 100
    IF i % 15 == 0
      IO.write("FizzBuzz\n")
    ELSEIF i % 3 == 0
      IO.write("Fizz\n")
    ELSEIF i % 5 == 0
      IO.write("Buzz\n")
    ELSE
      IO.write(i)
      IO.write("\n")
    }
  }
  RETURN 0
}

Zimbuはブロックの開始に{を持たず、終了にのみ}を持つちょっと変わったシンタックスをしています。Zimbuのソース(拡張子.zu)をコンパイルすると、内部ではC言語のソースにトランスパイルされ、gccコンパイラにより実行モジュールが生成されます。実行速度も速く、さらにWebサーバも開発できる拡張性のある言語でした。

A-A-P/Agide

A-A-PはBram氏が開発したプロダクトで、ソースコードをダウンロードしてビルド後にインストールするという手順を自動化するためのビルドツールです。

Makefileのようなシンタックスを持つレシピファイルにより、複雑なソース構成でもビルドできるようになっていますコード2⁠。

コード2 A-A-Pのレシピファイル
    :variant BUILD
        release
           OPTIMIZE = 4
           target = myprog
        debug
           DEBUG = yes
           target = myprogd
    
    FILES = $BDIR/main$OBJSUF $BDIR/ version$OBJSUF
    
    GUI ?= gtk
    :variant GUI
       console
       motif
           FILES += motif.c
       gtk
           FILES += gtk.c
    
    :program $target : $FILES ui.c

A-A-Pでビルドしてインストールできるプロダクトとして、Bram氏本人が開発した統合開発環境(IDE⁠⁠、Agideが用意されています図1⁠。

図1 Bram氏が開発したIDE「Agide」
図1

Agideはマルチウィンドウで構成されており、デバッグ機能を持ったIDEです。エディタおよびデバッガのソース表示部分にはVimが使われています。筆者は簡単なプログラムでAgideのデバッグ機能を使ったことがありますが、十分に機能しており実行中の変数の値も確認できました。

現在のVimはGNUデバッガ(gdb)を使ったデバッガdebug.vimを内包しており、Vim単体でコンソール、ソースブラウズ、変数の値表示や更新などができるようになっています。これにはAgideで開発した際の知識が詰め込まれていると言えるでしょう。

ウガンダの恵まれない子供たちへの援助

読者のみなさんはVimを起動したときに表示されるメッセージをしっかり読んだことがあるでしょうか図2⁠。Vimはチャリティウェア[1]です。ICCFInternational Child Care Fundを介してウガンダの孤児院へ寄付することができます。

図2 Vimの起動画面
図2

Bram氏は、定期的にウガンダに足を運び、実際にウガンダの子供たちがどのような生活を送っているのかをVimのホームページを介して紹介していました。

また、VimのオフィシャルサイトにはVimに追加してほしい機能を投票できるページがあります。このページでは、ウガンダへの寄付をした人に追加する機能への投票券が与えられていました。

Bram Moolenaar氏の性格

Bram Moolenaar氏の私生活はとても謎が多いことで有名でした。筆者が知っているBram氏は、お酒とモンティ・パイソンが大好きで、職業不詳、どうやってウガンダへの旅費を稼いでいたかもわからない人物です。かと思えば、2006年には突然Googleに入社し、忙しいはずなのに相変わらず日々Vimの開発を続ける、⁠良い意味で)化け物のような開発者でした。

ここまで読んだ方は、Bram氏にどのような印象を持たれたでしょうか。チャリティに積極的で、温厚な人物でしょうか? 実は、Vim開発者のメーリングリストvim-devの間では、Bram氏は「頑固」で知られていました。

vim-devやGitHub Issuesでは「こんな機能を追加したい」という要望がたくさん集まります。しかし多くの要望はBram氏の信念により却下されてきました。筆者もそのうちの1人です。いくつかの事例を挙げて、Bram氏のVim開発へのこだわりと人柄を紹介します。

ソケット通信パッチ

筆者の却下されたパッチの1つがVimにソケット通信機能を追加するパッチです。最近のバージョンのVimではTCP/UDPソケットを使った通信を行うためのchannelという機能が含まれています。これは外部のプロセスと通信できる便利な機能なのですが、昔のVimにはこの機能がありませんでした。C言語で開発されたvimprocというプラグインを使うことでそれっぽいことを実現できてはいましたが、画面がチラついたり処理が遅くなったりする弊害がありました。そこで筆者は2003年ごろ、Vim本体に手をいれ、Vimだけでソケット通信ができるようにしてvim-devに投稿しました。

Vimユーザーのいくらかの人はこのパッチを喜んでくれましたが、Bram氏は「Vimはテキストエディタなので、この機能は取り込むべきじゃない」と言い却下しました。

あとあと、Vimにはchannel機能が入ることになるのですが、それならあのときのパッチが取り込まれても良かったのでは、と思うこともあります。しかし、Bram氏がその時々にVimに求められている物を反映した結果が現在のchannelだったのだろうと感じています。

channelとNeovim

2013年ごろまでのVimのメインループはキーを押したりマウスを操作したり、ウィンドウの幅を変更したりといった外部の要因で初めて処理が実行されるような実装になっていました。これはVimでは非同期処理ができないことを意味しており、たとえばテキストの編集操作を損なわずに重たい処理をバックグラウンドで実行できませんでした。

これを解決するために、当時はあらゆるハックが行われてきました。たとえば、updatetimeというオプションにVimの内部処理を自発的に更新させる作用があることを利用し、その間隔(デフォルトは4秒)を短くすることで、別途起動していたスレッドの完了をチェックするといったことをやっていました。

しかしupdatetimeは本来は画面を更新するためのオプションです。短くすることで画面がチラついてしまいます。多くのプラグイン作者がこのようなVimの動作に悩んできました。

そこで2013年9月、Geoff Greer氏がVimに非同期処理を追加するためパッチをvim-devに投稿しました。こちらはJavaScriptのsetTimeoutのような機能でした。とても小さなパッチでしたが、これまでイベントループを使わず実装してきた物をすべてを改善するには抜けが多いパッチで、Bram氏は難色を示しました。

続く2013年12月、Thiago Padilha氏がvim-devで非同期処理に関する提案を行いました。これはマルチスレッドとメッセージキューを使って、特定のイベントを発火させるというしくみでした。

こちらに関してはBram氏は反応を見せませんでした。Vimはどちらかというと保守的なソフトウェアです。OSの設定ファイルを編集する目的でも利用されているテキストエディタとして、どんな環境でも動作しなければなりません。いろいろな機能やライブラリに依存して特定の環境でしか動かなくなってしまうことは、Vimにとって本末転倒です。マルチスレッドが使えない環境であっても動作しなければなりませんから、筆者としてはBram氏が消極的であった理由もわかります。

その後、これらの進展がないことにいら立ちを感じたのか、Thiago Padilha氏はVimをforkして非同期処理を取り込み始めました。これがNeovimの始まりです。

Neovimはその後、内部のスクリプト言語をLuaに変更したり、ターミナル機能やいわゆるポップアップウィンドウを実装したりして多くのユーザーを獲得しました。今やVimとは別のテキストエディタと言っても良いかもしれません。

筆者が知る限り、Bram氏はNeovimに対して特別に言及したところも、また不満などを漏らしたところも見たことがありません。また、Neovimが開発を先行しているからといって何かの機能の追加を急いだりすることもありませんでした。我が道を行くBram氏らしいですね。

違う道を歩むVimとNeovim

Vimのヘルプファイルには「design-not」という項目があります。ここには、Bram氏の固い決意による、Vimがテキストエディタであるための設計指針が書かれています。Vim 8.1以前のバージョンには次の一節がありました。

Vimはシェルやオペレーティング・システムではありません。Vimの中でシェルを実行したり、Vimを使ってデバッガをコントロールしたりすることはできません。
その代わりこれは動作します:シェルやIDEからVimをコンポーネントとして使う

Vimがターミナル機能を内包するようなことはないと明記されています。そして「IDEからコンポーネントとして使う⁠⁠、これはまさに前述したA-A-PのAgideのままです。しかしこれには欠点がありました。sshでログインしたリモートホストの中で、Vimを使ったデバッグができないのです。

この機能が欲しくなったBram氏は2017年のある日、突然vim-devにこんなメッセージを送ってきました。

私はVimの中に端末エミュレータを追加することが果たして良いアイデアなのかずっと疑問を持ち続けてきました。それは危険なことであり、またVimの規模も大きくなり、そしてメンテナンスの悪夢にもなり得ます。しかしそれと同時に、これは非常に、非常に便利になり得ます。

私が今回これを望んだ理由は、ssh接続でVimをデバッグするためです。私はローカルで程よい設定をしているので家にいない時はいつも苦しんでいます。 そういった制限は、私が家に帰りデバッグするための時間を延期してしまいます。デバッガ機能を提供するプラグインがありますが、それを使いVimをデバッグするには端末で実行する必要があるのです。

そしてVimにターミナル機能が実装され始めました。これには多くのVim開発者が驚かされました。なにせ「design-not」に書かれている内容とはまったく逆の内容だったからです。筆者も驚きを隠せませんでしたが、その後VimのUNIX向け実装にターミナル機能が入り始めた直後から、急いでWindows向けの実装を始めました。結果としてはVimはUNIX向けよりもWindows向けのほうが先(さらに言うならNeovimのターミナル[2]がWindowsをサポートするよりも前に)にターミナル機能が実装されることになりました。

そして「design-not」も次のように書き換えられました。

Vimはシェルやオペレーティングシステムではありません。Vimはシェルやデバッガを実行できる端末ウィンドウを提供します。例えばssh接続ができます。しかしテキストエディタを必要としないのであれば、それはVimの対象外です。⁠代わりにscreenやtmuxなどを使ってください)

一見、きまぐれで変更されたようにも感じる方もいるかもしれませんが、これにはVimが今後も生き残るためには時代に合った求められる機能を追加すべきというBram氏の考えがあったのだと思います。これも、Bram氏のこだわりと言って良いと思います。

さらにそのあと、Vimにもchannel機能による非同期処理のしくみが入りました。タイマーも入りました。またポップアップウィンドウの実装も入りました。しかし、Bram氏のこだわりで、たとえNeovimがすでに実装している同様の機能をVimが取り込むことになったとしても、自分が納得のいく形でしか実装しませんでした。

前述のように今やNeovimとVimは実装方式も異なっており、NeovimはVimの操作ができる別のテキストエディタとして開発されていますが、VimはVimのペースで開発が続けられています。またVimにもNeovimにはない新しい機能が追加し続けられています。

vim-devと私

筆者が初めてVimに出会ったのはVimがバージョン2.0になった1993年のころでした。このときのVimは、開発版ですでにマルチウィンドウをサポートしており、設定ファイルvimrcではifによる分岐ができるようになっていました。当時はお世辞にも使いやすいとは言えず、頻繁にクラッシュした記憶があります。

それから幾年が過ぎてVimがバージョン6.4になったころ、Vimの開発者メーリングリストvim-devにパッチを送るようになりました。初めてのパッチが取り込まれ、パッチファイルに名前が書かれてインターネットに公開されたときのうれし恥ずかしい感情は今も忘れられません。それからは毎日Vimのソース更新を確認し、手元でビルドする日々を送っていました。

英語コンプレックス

今も英語は得意ではありませんが、当時の筆者はとくに英語にコンプレックスがあり、幾度か勝手な読み違いをして見当違いなリプライをvim-devに投稿してしまったことがあります。

あるとき、また読み違えてしまった筆者はBram氏に「英語が不得意で申し訳ありません」と謝罪のメールを送ったことがあります。Bram氏は怒ることもなくただただ優しく「君と私には共通の言語、C言語があるじゃないか」とリプライをくれたのです。

このリプライが以降の筆者の英語コンプレックスを大きく解消してくれることになり、あらゆるOSSコミュニティでも当たって砕けろの精神で話しかける勇気を得ることができました。筆者が今でもBram氏に感謝している一番大きな出来事です。あのときこの言葉を掛けてくれてなかったら、もしかしたら筆者はOSS活動を続けていなかったかもしれません。

Bram Moolenaar氏と握手

VimConfはVimに関する国際カンファレンスをやろう、という決意で2013年から始められたイベントです。そして以前からどうにかしてBram氏を日本に呼びたいと願い続けてきました。筆者も2017年からスタッフとして活動してきました。

そして2018年、Bram氏からVimConfへの参加にOKをもらい、VimConf 2018が東京の秋葉原アキバプラザの"アキバホール"会場で開催されました。筆者は基調講演をさせていただきました。筆者が会場に到着した際、先に到着していたBram氏を見つけ握手したときの緊張は今も覚えています。

VimConf 2018は筆者とBram氏の基調講演から始まり、多くのVim/Neovimユーザーがいろいろなテーマで1日中発表を行うとても濃いイベントとなりました。Bram氏は講演の中で「Vim scriptを速くするにはどうすれば良いか」という問題に対して「速いコンピュータを買いなさい」と答えて会場を爆笑させていました。

VimConf 2018開催翌日、日本のVim有識者数名とBram氏が1ヵ所に集まりVimの今後について話す会議を行いました。その際、いくら待っても会場に登場しないBram氏を心配していた中、GitHubのvimリポジトリに新しいコミットが追加されたのを見た我々は会場で大爆笑したのを覚えています。

その後Bram氏を交えて我々が考えるVimの未来を説明したりモンティパイソンを観たりしました写真1⁠。

写真1 2018年に行われたVim有識者会議の様子
写真1

Vimのこれから

Bram氏が亡くなり、Vimの将来を不安に思う方もいるでしょう。とくにこれまでBram氏のみがmasterブランチにコードをpushしていた開発体制をこれからどのようにするかについて心配されている方もいると思います。そのように感じられている読者のみなさんには、その心配は必要ないということをお伝えしたいです。

これまでBram氏の右腕としてVimにコントリビュートされていたChristian Brabandt氏は2023年8月9日、それまでGitHubのVimオーガナイザとして選ばれていたChristian Brabandt氏、Dr. Chip氏、日本のK.Takata氏に加え、Yegappan Lakshmanan氏、zeertzjq氏、Dominique Pellé氏、そして筆者(mattn)をVimの正式なメンテナーとして追加することを公表しました。これ以降、Vimに関する決定事項はこのメンバーで決めていくことになると思います。

そしてこの原稿を書いている2023年8月26日現在、GitHubのVimリポジトリには以前と変わらない流量のPull Requestが送られてきており、Bram氏が体調を崩す以前と同じほどのコミットが行われています図3⁠。

図3 2023年8月時点でのコミットグラフ
図3

本稿執筆時点ではVim 9.1のリリースについて話し合われています。

おわりに

Vimの誕生と成長、Neovim誕生の経緯、またBram氏がどのような人だったのかについて解説しました。これまでのBram氏の意思を引き継ぐべく新しい開発体制となります。これからのVimもよろしくお願いします。

おすすめ記事

記事・ニュース一覧