新しいremoteプロトコルがやってくる
Posted at 2011/05/20ツイート
こんにちわ。たまにはこっちで書いてもいいかなと、ブラっと立ち寄ったmattnです。
vimには複数のインスタンス間でコマンドや式がやりとりできるremote機能があります。
# vim --servername GVIM --remote-send file.txt
こんな感じに別のvimにファイルを開かせたり
# vim --remote-expr 1+2
3
難しい計算をやってもらったり出来ます。またvimscriptからも扱えます。Windowsではウィンドウメッセージを使ってプロセス間通信が行われており、gvim.exeでもvim.exeでもやりとりが出来る様になっています。ただしLinuxではX11を使ったイベント通信が使われており、X11を入れていない、またはX11が起動していない場合にはこの素晴らしい機能を使う事が出来ませんでした。
またvimはperlやruby、pythonといったスクリプト言語を補助言語として扱う事が出来ますが、これらの言語で処理をバックグラウンドで起動させておきながら編集中にイベントを発生させるといった事が簡単に出来ませんでした。例えば、vimからLingrのchatが出来るlingr.vimがありますが、あれはバックエンドとしてpythonを使っており、発言があった場合にvimのインタフェースを呼び出しています。しかしながらvimはスレッドセーフではありません。インタフェースを呼び出した瞬間にvimが処理中であった場合には問答無用でクラッシュしてしまいます。これはvimにキーを送りつけるfeedkeys()を使っても同じです。
これまでvimhacker達はこれを回避する為に、カーソルが一定時間停止した際に発生するCursorHoldイベントを駆使してそれっぽいvimscriptを書いて来ましたが、このCursorHoldはキーが連続で押下された場合には発生しませんし、イベントが発生するまでの時間を設定出来るupdatetimeオプションはグローバルオプションである為、異なるvimscript同士が干渉しあう事もありえます。
現在、開発フォーラムであるvim_devではこれの代替とするsetInterval()の提案も行われていますが、かなり望み薄です。
vimにバックグラウンドから通知を行ったり、背後でflymakeを行ったりするvimscriptがこれまで無かったのはこれが原因です。
ところが、この問題を解決してくれるであろうプロジェクトがひっそりと始まりました。古参ユーザなら知ってる人もいるであろうYukihiro Nakadairaさんです。
これまでunixがX11で通信していた部分をunix domainソケットで、windowsがウィンドウメッセージで通信していた部分を名前付きパイプで実装を書き直しています。これにより、Xが起動していなくても、またWindowsではtelnetでログインしていたとしてもバックグラウンドから安全にメッセージを受信出きるようになるのです。
現在まだテスト中ですが、基本的な動作は既に実装済みでVIM1からVIM2へ
:echo remote_expr("VIM2", 'remote_expr("VIM1", "1+2")')
といったオウム返しも実行出来ます。すばらしいですね。
現在、おそらくテスターは僕と中平さんだけだと思いますが、皆さんがテストに参加して頂ければこのあと開発フォーラムへのプッシュも楽になると思っています。
ぜひテストに参加してみて下さい。
clientserver without X
もどる
blog comments powered by Disqus