2012年5月28日
WindowsとVMWare開発においてpbcopy的なやつ
僕は最近のWeb開発者にしては珍しくメインマシンがWindowsで、開発は全てVMWareのLinuxにputtyで繋いでやっています。
そうなると、やっぱクリップボードと連携したいとかそういう時があります。screenのペーストバッファをWindowsでも使いたいとか。
これまではマウスで選択して貼り付けてとかやってたんですが、screen縦分割とかしてると矩形選択モードに切り替えないといけないけどやり方忘れたりするし、何よりダサい。
Macにはpbcopy/pbpasteという便利なコマンドがあり、それと同じようなことが出来れば万事解決です。
解決策は簡単で、WindowsとVMは普通にTCP通信ができる(当たり前!)ので、Windows側にサーバーを立てて、クリップボードの読み書きが出来るAPIを提供すれば良い。
僕はWeb屋でPerl屋なので、plackでHTTPサーバー立てて、REST APIを提供するのが楽。
てことで作りました。
Windows側のどこかに適当に落としてきて、winpb.batをダブルクリックするだけでとりあえず動くと思います。(動作にはPerlとPlackとRouter::Simpleが必要で、app.psgiをそのまま使う場合は、Plack::Middleware::Auth::QueryStringも必要です。)
上手いこと、起動したら、以下にアクセスしてみてください。
http://localhost:52225/?key=change_on_install
クリップボードの中身が見えたら成功です。
とりあえずそのままだと危険なので、タスクマネージャーからwperl.exeのプロセスを探して停止して下さい。
config.plを設定して認証keyの設定をしたり、plackupの引数で、VM用のnat側のIPアドレスしかlistenしないようにするなどすると良いでしょう。ひととおり設定したら、もう一度、winpb.batを起動。念のためブラウザでも確認してみて、OKならばスタートアップにも登録しておくと良いでしょう。
Windows側の設定は以上です。
あとは、VM側のLinuxの設定ですが、以下の様なスクリプトをパスの通ったところに置いておくと良いと思います。単にcurl使ってるだけです。
pbcopy
#!/bin/sh
. ~/.pbcopyrc
if [ -p /dev/stdin ];then
PASTE=`cat -`
else
echo 'usage: echo "hoge" | pbcopy';exit
fi
curl --silent http://$PBHOST/?key="$PBKEY" --data-urlencode "pb=$PASTE" > /dev/null
pbpaste
#!/bin/sh
. ~/.pbcopyrc
curl --silent http://$PBHOST/?key="$PBKEY"
設定ファイル~/.pbcopyrcに変数PBHOSTとPBKEYの設定をしています。
ちなみに、curlの--data-urlencodeオプションはPOSTデータをurlencodeしてくれる便利なオプションですが最近のcurlにしかないようです。CentOS5.5に入れようとしたら依存ライブラリ等の解決が色々めんどかったので、別途urlencodeしたりしました。
$ echo hoge | pbcopy
とかやって、ちゃんとWindowsのクリップボードにhogeが反映されるのを確認したら、以下のように.screenrcに追記すれば Esc-pでスクリーンのペーストバッファがクリップボードに入るようになって胸熱です。
bufferfile '.screen-exchange-file'
bind p eval 'writebuf' 'exec sh -c "cat .screen-exchange-file | pbcopy"' 'echo "paste to remote"'
すごく簡単な話です。なんで最近まで思いつかなかったのか。これまでWindows側にサーバーを立てるとかそういう発想があまりなかった。
ちなみに、Win32::ClipboardのUnicode対応がイケてなくて、残念ながらcp932領域の文字列しかWindows側に送ることができません。逆にWindows側でコピーしたUnicodeテキストはちゃんとutf8で取得できるようになっています。