Vim昔語/昇華編

スクリプトとネイティブコードによる拡張が本体に取り込まれていく、そんな昇華の思い出話。

スクリプトとネイティブコードによる拡張が本体に取り込まれていく、そんな昇華の思い出話。ここのところちょっとくどくなりすぎているので今回はアッサリめに。

前話から少し時期が遡るかくらいのころ、バージョン5.xまでVimでは文字コードを扱えなかった。私はqkcを使っていたので困っていなかったが、私に届く要望・質問としてはやはり最優先事項だったと思う。もともとABrowserを作って公開していたくらいなので文字コード認識&変換ロジックを書いて組み込むのは容易かったが、jvimのように日本特有の変更になってしまうのは許しがたかった。そんな時、開発の進んでいた新バージョン6.0に光明を見た。

今もあるがVimの開発版に‘charconvert’(以下ccv)というオプションが追加された。このオプションはVimでファイルを開く際のフックで、Vimスクリプト関数で文字コードを変換するという使い方をする。またこのオプションとは関係無く、どうしてかは覚えてないがVim自身がlibiconvを使うようになっていた。私はこれをチャンスと思い、Vimスクリプト(libcall)+ネイティブコード(dll/so)+libiconvを駆使して、文字コードを変換するvim_ccv拡張を作成しvim-devメーリングリストに投稿した。

私のメールは例によってシンプルで短かったが、Bramからの返事は長かった。返信されたメールを一瞥した瞬間「こんなに長くちゃもうダメだ~」とも思ったが、内容はまったく逆で絶賛と言って良いだろう。小泉元首相風に言うのであれば「感動した!」というニュアンスの書き出しになっている。結果から先に言うと、このVimスクリプト+ネイティブコードによるvim_ccv拡張はかなり形を変えたが、その意図したものはVim本体に取り込まれている。Bramはオランダ人ということもあってか、日本などのマルチバイト文字文化圏の事情(ひいては多様なユーザニーズがあるということ)に非凡な理解があり、一旦問題を認識してもらえればすんなりとそしてベストな形で解決してくれるので、とてもやりやすい。仮に彼がアメリカ人かイギリス人だったらこうはいかなかったかもしれない、なんて考えてしまうのは偏見だろうか。

またこのvim_ccvにはBramの心を動かす仕掛けがしてあったことも重要だったかもしれない。libiconv.dllの動的読み込みだ。動的読み込みとはWindows向けの機能で、通常Windows版ではDLLをリンクしてしまうとそのDLLがない場合に起動すらしないのだが、そのDLLに依存した機能だけを無効化した状態で起動できるようにするものだ。この動的読み込みの良い点は、1つのバイナリでその機能を必要とする人としない人両方をサポートできることだった。ある機能は必要な人にとってはとても重要だが、不要な人にとっては心底あってほしくないものなのだ。私はこの時点で既にPerlとPythonの動的読み込みパッチを提供しておりacceptされていた。libiconvの動的読み込み化という仕事を他人に渡したくはなかった。

ともあれ幾らかの議論はあったが、こうしてVimスクリプト+ネイティブコードによる拡張はVim本家を動かすものとなった。いま改めてこの事例から学べることはなんだろう。目的のためプログラミング言語の境界を超えるのに躊躇しないこと、日本特有のニーズを世界的なニーズに昇華させること、読むだけでその意味・意図が伝わるコードを書くこと、自分のアイデアや技術が必要とされる時期を逃さないこと…

以下、続くかもしれない。

ちなみつい先日もlibiconvを使うコードを書いたがエンバグしてた。いろいろとややこしいやつだ。