風邪で1週間くらい寝込んでいたのですが、布団にこもってなんとかVimで快適に画像や動画などのメディアを表示できないか考えていました。それに対する一つの提案としてあるプラグインを開発しています。残念ながら本日リリースは間に合いませんでしたが、実装にあたって色々と勉強になったので、Tipsを書いておきます。scriptと外部プログラムとでソケット通信したい前述の開発中プラグインでは、Vimから独立したソフトウェアを起動・操作するという仕組みを導入しています。今回は例としてvimprocを用いRubyと連携する簡単なプログラムを書いてみます。endend解説まず、start関数ではvimproc#popen2関数を使いプロセスを開始しています。popen2はプロセスオブジェクトを返してくれ、そのメンバpidにはその名の通り起動したプロセスのIDが格納されています。start関数ではこうして取得したpidをスクリプトローカル変数として保存します。popen2関数には任意のコマンドを渡すことができます。12345′というコマンドが渡されます。次にstop関数では、先ほど取得したpidのプロセスがまだ終了していない場合、プロセスを終了させます。ここではvimproc#kill関数を使用します。kill関数では、任意のpidを持つプロセスにシグナルを送信することができます。ここではプロセスを終了させたいので、SIGQUITを意味する3をシグナルとしてpidに渡しています。start関数とstop関数で使用しているis_run関数についても説明します。is_run関数はstartによって保存されたpidを持つプロセスがまだ終了していないかどうかの判定を行います。先ほど説明したvimproc#kill関数では、のシグナル部分に0を指定することで生死確認を行うことができます。返り値が0の場合はプロセスが生きており、1の場合は終了してしまっています。最後に、send関数について説明します。この関数はvimproc#socket_open関数を使用しソケット通信を用いてrubyスクリプトに文字列(a:command)を渡しています。vimproc#socket_openの第二引数はportになります。start関数ではs:portをrubyスクリプトに渡しており、rubyスクリプトは指定されたportでsocket通信の待機を行います。rubyスクリプトも簡単に解説しておきます。このrubyスクリプトは、引数としてソケット通信の待機portを受け取り、ソケット通信のlistenを開始します。script側から通信があるたびに、それを文字列として表示させています。Signal.trapを用い指定のSIGNALが送られた時の処理を定義しています。scriptのstop関数から送られるSIGQUIT命令を受け取ったらプログラムを終了する、といった形ですね。このように、vimprocを使用することでとても簡単にプロセスのハンドリングやソケット通信を行うことができます。Vimと外部ソフトウェアとの連携によってより高度な表現が可能になると思いますので、みなさんもぜひ活用してみてください。2012、明日124日目は@cohamaさんです...!はてブに追加この記事をツイートFeedlyで購読supermomongaかなりすごいことでゆうめい。したまちでしらぬものはいない。),;’EmacsユーザーがVimを1ヶ月使った感想RubyでGUIアプリを作るならJRuby+JavaFX+Rawrで決まり!automatic.vimでウィンドウの一時的分割をハンドリングしようももんが流NeoBundle管理術Vimと対話せよVimShellが動的プロンプトに対応しました(やばい)ジャズだって聴ける。X(1)homebrew(1)rbenv(1)Evil(1)Mechanize(1)Scraping(1)聴いてるやつ。