deoplete.nvim開発者、Shougoが考える「Vimの限界ギリギリ」を攻めるプラグイン開発の裏側

多くのエンジニアに愛されるテキストエディタ『Vim』のプラグインを作り続けるShougoさん。Vimmerならば一度は使ったことがある、というほどに広く知られたプラグインを作り続ける理由を聞きました。

deoplete.nvim開発者、Shougoが考える「Vimの限界ギリギリ」を攻めるプラグイン開発の裏側

「あなたにとって、テキストエディタとは何ですか?」

こう聞かれたとき、あなたは何と答えるでしょうか。開発に不可欠な大事なツール、あるいは、ただの道具──。きっと十人十色の回答が返ってくるでしょう。

この問いに対し、「テキストエディタとは世界」と迷いなく答えるエンジニアがいます。Vim/Neovimのプラグインマネージャーdein.vimや、Neovim/Vim8用の入力補完プラグインdeoplete.nvimなどの開発者であるShougo(しょうご/ 1 @ShougoMatsuさんです。彼の開発するVimプラグインの完成度の高さは世界中のエンジニアの支持を集め、生み出した全プラグイン累計の獲得GitHubスター数は2万を超え、以下のShougoさんが送り出したリポジトリには、圧巻の開発履歴が残されています

学生時代にテキストエディタに魅了されて以来、孤高の存在としてVimプラグイン開発を続けてきた彼は、いったいどのような道のりを歩んできたのでしょうか。本稿では、その知られざる歴史を紐解きます。

Windowsユーザーじゃなかったら、今ごろEmacsを使っていたかもしれない

2

Shougoさん:情報工学系大学院を卒業後、都内IT企業に入社。学生時代よりVimプラグイン開発、OSSに積極的にコミットしている。VimConfにも積極的にスピーカーとして参加するなど、Vimカルチャー全体に献身的にコミットする。

──Shougoさんは、いつ頃テキストエディタと出会ったのですか?

Shougo 高校生の頃ですね。授業でプログラミングを扱う機会があって、IDEとしてMicrosoft Visual Studioを使っていました。Vimを使い始めたのはもう少し後で、大学生になってからです。

──最初にMicrosoft Visual Studioを使い始めたならば、そのIDEを使い続ける道もあったと思います。なぜ、そうしなかったのでしょうか?

Shougo 答えはシンプルで、自宅のPCにMicrosoft Visual Studioが入っていなかったのと、有償のツールなので別のものを使いたいと思ったからです。

何か良いものはないかと思って、いろいろなエディタやIDEを漁っていました。サクラエディタを使っていた時期もあったんですが、ソースコードを書く上では不便な面が多かったので、やめました。もっと開発がしやすいテキストエディタはないかと探していたところ、Vimと出会いました。

──ここで運命の出会いが! Vimのどんなところが魅力的だったのですか?

Shougo Vimは当時から300種類くらいの言語に対応していて、シンタックスハイライトを各言語に合わせることができたので使いやすかったんです。そして実は、同じ時期にEmacsにも出会いました。

──両者を比較した上で、Emacsを使わなかったのには何か理由があったんですか?

Shougo 私が使っているPCのOSがWindowsだったんですよ。EmacsはLinux上で使用されることを想定しているので、Windowsだとなかなか思うように動いてくれなくて。

もし私がそのころにLinuxを使っていたら、運命が変わっていたかもしれません。「Emacsは使いやすいな。Emacsのプラグインを作ろうかな」と考えていたかもしれないです。けれど、Windows上ではVimの方がちゃんと動いたので、「こっちの方がいいや」となったわけです。

──Vimを使い始めるにあたり、苦労した点などはありますか?

Shougo みんなそうだと思うんですけど、最初は独特の操作性に慣れるのが大変でした。だから最初は、Vimの操作に慣れるよう“矯正”していったんです。

──矯正というと、何をしたのですか?

Shougo 例えば設定を変更して、Windowsのメモ帳の代わりにVimが起動するようにしたり、ひたすらチュートリアルをやりこんだり。そうしながら、よく使う機能から少しずつ覚えていきましたね。

3 usr_01 - Vim日本語ドキュメント 

Shougoさんが取り組んだVimのチュートリアル「Vimtutor」は、コマンドライン上に表示されるVimの使い方をもとに、文字を編集しながら操作を練習できるものだ。約30分の演習コースのなかで、Vimを扱う上で最低限必要な操作方法を習得できる。

Vimの設定いじりが導いたプラグイン開発

──それからは、徐々に“Vimの道”へ?

Shougo そうですね。vimrc1ファイルをいじって、自分好みにカスタマイズするようになっていきました。もちろん、ゲームを作ったり、C++でライブラリを書いたりとそれ以外の開発もやっていましたけど、それ以上にVimに触れていること自体が面白かったです。

──Vimの設定が持つ楽しさってどんなところにあるのでしょうか?

Shougo 終わりがないところと変化していくところですかね。設定量が膨大なのでとにかく奥が深いです。それに、コミュニティによる開発が続いているので、多種多様な機能やプラグインが増え続けています。取り巻く環境が常に進化しているんです。もしかしたら、興味がない人にとってはマニアックでわけが分からない世界かもしれません(笑)。でも、私にとってはそれが楽しかったんです。

──そうしてVimの世界にのめり込んでいったのですね。vimrcをいじるようになり、それが徐々にプラグインの自作に結びついていった、という感じですか?

Shougo はい。私にとってはプラグイン開発は設定の延長線上のようなものです。そもそも、Vimのプラグインってそういうものなんですよ。要するに、vimrcに書いた設定やスクリプトを単体で動くようにしたものがプラグインなので、設定を突き詰めていけばいつの間にかプラグインになっているんです。

私の場合、もともとは他の方が開発していたプラグインを使っていたんですけど、うまく動かなかったり、求めている機能がなかったりして、結局は自分で改造していました。それだったら、最初から自分で作った方がいいと思うようになって。もしかしたら、プログラミング言語やフレームワークを作る方もそういうモチベーションで開発を始めるのかもしれないですね。

自分の欲しいプラグインが世の中にないから、作る

4

Shougoさんは、Vimに関するアイデアを書き留めておく通称「Vimノート」を常に持ち歩いている。良い設計や実装の方法を思いついたときには、このノートに書き留めておき、後から読み返すという。ノートパソコンやタブレットは持ち歩かない主義なのだとか。

──最初はどんなプラグインを作ったのですか?

Shougo 最初に作ったのは、vimshell.vimの前身となったプラグインでした。

5

画像はvimshell.vimのスクリーンショット。vimshell.vimのREADMEより。

なぜshellのプラグインだったのかというと、これも私がWindows使いだったことに起因していて、Windowsにまともなコンソールが無かったんです。コマンドプロンプトは非常に使いづらくて。そこで、「Vimからshellを実行可能にしよう」と思って既存プラグインを漁ったんですが、なかなか良いものがなかった。ならば、自分で作った方が早いと考えました。

その後に作ったのがneocomplcache.vimです。これを作る前は、入力自動補完プラグインとしてacp.vimを使っていました。でも、このプラグインはVimの持つ補完機能をそのまま使うという思想だったので、自分の思うようにカスタマイズできません。ならば、独自カスタマイズしやすいプラグインを作ろうと考えました。それがneocomplcache.vimです。

6 GitHub - Shougo/neocomplcache.vim: Ultimate auto-completion system for Vim.

──プラグインの着想が「自分の使いたいものを作る」ところからスタートするんですね。

Shougo そうですね。基本的には自分が使うものを作っている感じです。でも実を言うと、私はVimmerのなかでも特殊なタイプなんですよ。というのも、古くからVimを使っている方々は、そもそもあまりカスタマイズやプラグインの利用をしない人が多いんです。

でも、私はIDEから使い始めてVimにたどり着いたので、「IDEでできる機能はVimでもできてほしい」と思っている部分があります。入力補完なんかはまさにそうですね。

──なるほど。ちなみに、他の方が作ったプラグインで「これは素晴らしい」と思うものはありますか?

Shougo VimではなくEmacsのプラグインになりますが、auto-complete.elanything.el(現在の名称はhelm)には大きな影響を受けました。

──どんな部分に影響を受けたのでしょうか?

Shougo これらのプラグインが持つ「情報源」という考え方です。「フレームワークは基本的な枠組みを提供するだけで、情報源となるパーツを組み替えることで多種多様なニーズに対応できる」という設計思想でした。その考え方に衝撃を受けて。

それらはEmacsのプラグインなので、Vimにも同様のものがあればいいと思いました。それが今ではdeoplete.nvimとdenite.nvimになっているんです。

7 GitHub - Shougo/deoplete.nvim: Dark powered asynchronous completion framework for neovim/Vim8

8 GitHub - Shougo/denite.nvim: Dark powered asynchronous unite all interfaces for Neovim/Vim8

プラグインのインスピレーションは、ボーッとしているだけでは浮かびません。情報を得るために、他の方が作ったプラグインのソースコードを読んだり、テキストエディタに関する著名人が発信した情報を見たりしています。日々の積み重ねが重要ですね。

Vimの限界ギリギリを攻めて開発する

9

──プラグイン開発においては、どんなことに苦心してきましたか?

Shougo Vimの限界を攻めることですかね。そうでなければ、実現できないような機能も多かったので。

──“Vimの限界を攻める”とは、具体的には?

Shougo 例えば、Vimにはもともとプロセス間通信や非同期処理を行うための機能がなかったんです。Emacsにはあったんですけど。だから、EmacsにできてVimにできないことをなんとかして実現するには、Vimの裏技を使うしかなかったんですね。

裏技としては、疑似タイマーというテクニックが良い例かもしれません。Vimには一定時間おきに実行される処理があるんですが、その処理に対してプラグインの処理を相乗りさせることで、擬似的にタイマー的な機能を実行させるというDirty Hackな手法です。

let s:use_timer = has('timers')
if !s:use_timer
  autocmd vimshell CursorHold,CursorHoldI *
        \ call s:check_all_output(1)
endif

Shougoさんが共有してくれた疑似タイマーの展開例。vimshell.vimより

けれど、その機能は当然プラグインのためのものではないので、Vim本体のグローバルな状態を変更する必要があります。副作用がいろいろとあって本当はあまり使いたくなかったんですけど。

最近はVimの機能が充実してきたので裏技的なコードの書き方は廃止しましたが、昔は必須でしたね。この例のように、プラグイン開発においてはプログラミング言語やツールの重箱の隅をつつくような処理を書かなければいけないことも多いです。

ある時期から、私はVim本体へもコントリビュートし始めたんですが、それはこういう事情が絡んでいます。要するに、良いプラグインを作るにはどうしてもVimの限界を突破する必要があって、「Vimにこの機能があれば実現できるのに」という局面が多々あるわけです。

ならば、待っていても誰もやってくれないから、自分がやるしかない。必死に勉強しながら、Vimの機能を開拓していきました。

──他にも、Vimの限界を攻めた例はありますか?

Shougo neocomplcache.vimの後継であるneocomplete.vimの開発が良い例かもしれません。Vim Scriptは処理速度が遅いので、もっと速い言語を用いて部分的に書き直したいと思っていました。そんな頃、VimがLuaInterfaceに対応したことを知ったんです。LuaはVim Scriptより速いのでそれを使ってはどうかと考えたんです。

10 The Programming Language Lua

けれど、これが苦難の道で。対応直後だったので、とにかくVimがよくバグるんですよ。うまく動かない、クラッシュするなんて日常茶飯事で。でも動かないとしょうがないので、Vim本体(当時はメーリングリスト)やvim-jp issuesに定期的にバグを報告して、なんとか動く状態まで持っていきました。

似たようなことは後続のdeoplete.nvimにおいてもありました。neocomplete.vimではLuaによる高速化をしましたが、それでも限界があったんです。もっと抜本的なブレイクスルーはないかと思っていたら、Neovimが登場してきたんです。

11

Neovimは、Vimの抱える課題を解決するためにVimからフォークされたプロジェクトだ。メンテナンスの簡略化や機能追加・バグフィックスの速度改善、モダンなUIの構築などを行い、新たな開発者のコミュニティへの参加とエディタの改善を促すことを目的としている。

12 Home - Neovim

Neovimにはリモートプラグインという革新的な機能がありました。これは、プラグインをNeovim本体とは別のプロセスで稼働させられるというものです。「これなら、非同期処理が可能なプラグインを作れる!」と思って導入してみたら、まだまだ導入実績が少なかったので初期の頃はバグが多くて……。

──どんなに優秀なツールも、リリース初期においてはトラブルがつきものなのですね。

Shougo そうですね。だから、デバッグをしてIssueを報告したり、Pull Requestを出したりしながら、地道に改善していきました。その結果として、今では快適に動く状態が実現できているんです。

誰かが貢献しなければ、OSSは途絶えてしまう

──2015年にdeoplete.nvim、2016年にdenite.nvimやdein.vimをリリースし、Shougoさんの名は世界中のVimmerから知られるものとなります。これらのプラグインは多くのユーザーに親しまれるものになりましたが、開発者としてはどんな想いがありますか?

13 GitHub - Shougo/denite.nvim: Dark powered asynchronous unite all interfaces for Neovim/Vim8

14 GitHub - Shougo/dein.vim: Dark powered Vim/Neovim plugin manager

Shougo 嬉しいのは間違いないですが、複雑な気持ちもあります。ユーザーが増えれば増えるほどサポートも大変になるんですよ。OSSって広く使われるようになるとその後は、開発者が情熱を持って精力的に開発を継続するか、燃え尽きてしまって放棄するかのどちらかが多いように思います。

私の開発したプラグインは個々で見ればスター数が数千ほどですけど、全て合計すると数万くらいのスター数になります。そのくらいあると、誰でも知っているようなプログラミング言語やプラグインと同じくらいのスターの数なんです。

それをほぼ1人で見るというのは、非常に骨が折れます。世界中からバグ報告やPull Requestが来て、その全てを捌いていかなければならないので。だから、膨大なエネルギーが必要で、半端な気持ちではできないですね。「俺はどうしてもこのソフトウェアを守り切るんだ。このソフトウェアで実現したいことがあるんだ」という強い気持ちがなければいけない。自分との戦いという部分はあると思います。

──人気のOSSの裏には、それを必死に支えているエンジニアがいるわけですね。

Shougo はい。だから、せっかくの機会なので話しておきたいんですけど、OSSにタダ乗りする“だけ”という関わり方は避けてほしいんです。

もともとOSSには、お金の代わりに利用者が自分の時間や労力を提供するという思想があるはずです。多くの人がタダ乗りするだけになったら、コミッターが消耗してしまいます。みんなで力を合わせて、何かしらの方法で支えていかなければいけないです。

私自身もこれまで、OSSのツールに助けられてきましたし、育てられてきました。だからこそ、その恩返しをしなければいけないですし、次の世代に渡していくべきだと思っています。私たちの世代で途絶えてしまってはダメなんです。

──では、Vimが今後もメンテナンスされ続けていくには、Vimの利用者が「コミュニティに対して何を還元していくか」という発想も必要になってくるんですね。

Shougo そう思います。私はなるべくVim関連のいろいろなイベントに登壇するようにしているんですけど、それはコミュニティを盛り上げたいという意味合いが強いですね。

Shougoさんは例年VimConfでスピーカーとして登壇している。

今年も「VimConf 2018」が開催されますけど、あのイベントは年々規模が大きくなって参加人数も増えています。そうなったのは、ひとえにコミュニティを支えるみんなの努力があったからです。

私の学生時代から開催されていたんですが、当時はすごく規模の小さな集まりでした。その遍歴を見ていると、OSSのコミュニティとはひとりでに大きくなるものではないんだな、と実感しますね。

テキストエディタを作ることは、世界を作ること

15

──ここまでプラグイン開発を続けてこられたことに対して、どのような感慨がありますか?

Shougo 人気プラグインをたくさん生み出せたことや、10年近くも開発を続けてこられたことは幸運だったと思います。色々なものを犠牲にはしてきましたし、メンテナンスを続ける苦しさも知りましたけどね。でも、私にとっての優先順位はまだまだテキストエディタが一番です。

──途中で開発が断念されるOSSも多いなか、なぜShougoさんはテキストエディタと向き合い続けることができたのでしょうか?

Shougo 難しい質問ですね……。私自身が、かつてテキストエディタに救われた経験があるから、というのが大きいかもしれません。

先ほど話したとおり、私は学生時代にプログラミングを始めました。当時はプログラミングが大好きでひたすらコードを書くことを楽しんでいたんですけど、あるとき燃え尽きてしまったんです。いろいろなことを勉強して自分なりに満足できるものは作れるようになってきたんですけど、自分の興味が何にあるのかよく分からなくなって。その頃にハマったのが、テキストエディタでした。

それまでは「テキストエディタなんてただの道具。使えればなんでもいいや」という感じだったんですけど、見える景色がまったく変わりました。「こんなにも深い世界があったのか」と。その経験があったおかげで、技術への興味が持続できたんです。

私にとってテキストエディタの優先順位が高いのは、その原体験があるからだと思います。もちろん他にも興味を持っているものはありますが、それらはあくまで趣味でしかないですね。

──他のものが趣味だとすれば、テキストエディタは何ですか?

Shougo 本業ですね。テキストエディタこそが本業で、他のものは趣味。私はいろいろな場で「テキストエディタは世界だ」と言っているんですけど、その理由は私の人生にとっての優先順位が一番高いからなんです。自分にとって理想のテキストエディタを作ることは、理想の世界を作ることと同義だと思っています。

──いつの日か「これこそ完璧なテキストエディタだ」と思える日は来ると思いますか?

Shougo 来る気はしているんですけど、来たら来たでつまらないかもしれないですね。刺激が無くなってしまうので。新機能を作らなくなって、バグ修正ばかりになったら、きっとモチベーションを保てなくなるじゃないですか。

OSSのツールやプラグインをメンテナンスし続けるには「こんな機能があったらいいな」とか「こうなったら便利だな」という気持ちを持ち続ける必要があると思います。私の場合は、それがまだまだ山ほどあります。だからこそ満足していないし、プラグイン開発を続けられるのかもしれないですね。

取材・執筆:中薗昴


  1. Vimをより使いやすくカスタマイズするための設定ファイル。Vimmer達はこのファイルに独自のチューニングを施すことで、各々の考える「最善のVim」へと仕立て上げていく。

若手ハイキャリアのスカウト転職