bonar note

京都のエンジニア bonar の技術的なことや技術的でない日常のブログです。

VimM #4 Vim Server 入門

行って参りました。VimM#4。
http://vim-users.jp/2009/06/vimm4-ann/
参加者50名という結構大規模な勉強会になっていて、なんだか心強い感じです。首都圏各地から集まった猛者たちの発表にまぎれて入門的なゆるい内容のものがあってもいいだろうということで Vim Server についてさわりだけ発表してまいりました。

Vim Server を選んだ意味は特になくて、なんとなくこの機能マイナーなんじゃないかという漠然とした感じと、宴会芸的に(決して技術的にではなく)面白いネタが出来るんじゃないかという淡い期待がありました。他だと :help s-ex の周りも面白そうな予感がしています。vimscriptの実行系を外部に切り出すっていうのに挑戦したいですね。

以下が発表内容です。

発表内容

slideshare

vim server 入門
  • :help clientserver
  • Vim Server?
    • vim を server として動作させるモード
    • 起動している vim に対してファイルやコマンドを送りつけることが出来る
  • setup
    • configure +clientserver
    • :version(+clientserver があれば使える)
    • :echo has('clientserver') (1と出れば使える)
  • 使い方1(FOOは任意のサーバ名)
    • vim --servername FOO (起動)
    • vim --serverlist (起動済みサーバ表示)
    • :echo v:servername (自分のサーバ名を確認)
  • 使い方2
    • vim --servername FOO --remote=<ファイル>(サーバ側でファイルを開く)
    • vim --servername FOO --remote-send=<キー>(サーバ側にキー操作を送信)
    • vim --servername FOO --remote-expr=<式>(サーバ側で式を評価して結果を表示)

Demo

  • 使い道を考える
Vim web server!
  • 問題点
    • listen 出来ない
    • proxy 作れば解決

Demo

proxy.pl

#!/usr/bin/perl
 
use strict;
use warnings;
 
use POE qw/Component::Server::HTTP/;
use VimRemote::Agent;
use File::Temp;
use File::Slurp qw/write_file read_file/;
 
my $aliases = POE::Component::Server::HTTP->new(
    Port => 80000,
    ContentHandler => { 
        '/' => sub {
            my ($req, $res) = @_;
 
            # pickup target vim server
            my $agent  = VimRemote::Agent->new();
            my @server = $agent->serverlist();
            if (0 == @server) {
                die "no vim server found";
            }
            my $server = shift @server;
 
            # send request file to the vim server
            my $tmpfile = File::Temp->new(
                TEMPLATE => 'vimhttpd-session-XXXXX');
            write_file($tmpfile, $req->as_string);
            $agent->run_timeout(60 * 10);
            $agent->remote_wait($server, $tmpfile->filename);
 
            # parse response
            my ($is_body, @response_body);
            foreach my $line (read_file($tmpfile->filename)) {
                $is_body = 1 if $line eq "\n";
                push @response_body, $line if $is_body;
            }
            my $response_body = join '', @response_body;
 
            $res->content_type('text/html');
            $res->content($response_body);
            $res->code(RC_OK);
            return RC_OK;
        },
    },
);
 
POE::Kernel->run;

VimRemote::Agent(ネタモジュールなので実際には使わないでください)
http://github.com/bonar/vimremote-agent/tree/master

  • 長所
    • request に対して非常に柔軟に対応
    • vim を使える悦び
  • 短所
    • MaxClient=1
    • 大規模サイトだと指がつる
  • 最後に
    • 本当は、「右クリックで開く」とかで、特定のvimインスタンスを指定して文書を開く、みたいな用途に使うらしいです
  • ご清聴本当にありがとうございました

動画キャプチャ

操作の動画(実際にはちゃんと(?)ターミナルでやりました)は、スクリンクロラ(http://www.bicoid.com/software/screenCrawlers/)というキャプチャソフトで取ってみました。使ってみたかったんです。動画キャプチャは有料じゃないとまともに使えないものが多いので無料でこの使いやすさは素晴らしいですね。QuickTimeの巨大なファイルが出来てしまうのと、ファイルの保存にかなり時間がかかるのがネックですが、それは差し引いてもいいです。iMovie でm4v に変換するといい感じです。

他の方の発表について

開始前に セキュリティ&プログラミングキャンプ2009の告知がありました。生吉岡弘隆さんを見ることが出来て感激です。講師の方も非常に豪華でかなり面白そうでした。もっと若ければ、、是非オーバーエイジ枠を設けて欲しいです。

taku-o さん ― “Vimでコード印刷”

普段vimを使っていてあまり印刷というのを意識しないので新鮮でした。visual mode で選択した範囲を印刷、とかはすごくvimならではですね。

hagino_3000 さん ― “VimJavaScript

Eclipse から vim への移行の話だったと思うのですが、最終的には無理せずEclipseに戻るあたりが秀逸だなと思いました。

ssig33 さん ― “人類の絶滅”

とにかくGrowlの嵐がすごかったです

ujihisa さん ― “blogger.vim

恥ずかしながら metarw 初めて知ったのですが、これかなり面白そうですね。いろいろなものに応用できそうです。webサービスへの操作のほとんどは GET と POST なので、これはこのまま文書編集のメタファーとして表現出来る、と考えると無限の可能性がありますね。

Ubuntu さん ― “Vim on Emacs

vim vs emacs という禁断の領域。個人的には vimscript vs elisp という比較になると非常につらいと思っていて、vim の魅力はもっと別の、「一体感」というか肉体と解け合ってる感じ、の部分なんじゃないかなと感じています。

kana さん ― “これからVimを極めたい人が読むべきたった一つの文書”

kana さんのvimバイブル、これはマストバイですよ!

まとめ

僕はかなり田舎に住んでいるので早く帰らねばならず、後片付けのお手伝いが出来ず申し訳ありません。。次回は是非。やっぱりこう同じ思考の人がこれだけ集まると楽しいですね。次回はもっと誰もしらないようなネタを考えたいなと思いました。vim の世界は広くて深いです。

ホスティングしてくださった皆様、ありがとうございました。楽しかったです!