2012/03/08


DB操作ツール Emacs DBI を作ってみた - 技術日記@kiwanami

このツールの目的は、クロスプラットフォームで便利なDB操作環境を実現することです。 pgAdmin や MySQL Query Browser のようなGUIの良さをCUIで実現してみようとしてみました。すなわち、ぼくのかんがえたさいきょうのDBツールです。ちなみに、このツールにとってEmacsはただの実行環境です。Emacs使わない人でも使うと便利だと思います。

http://d.hatena.ne.jp/kiwanami/20120305/1330939440
VimもーVimもー!

って事で作りました。

mattn/vdbi-vim - GitHub

Database client for Vim

https://github.com/mattn/vdbi-vim
Emacs版はepcというRPCプロトコルを使ってますが、Vimはソケットクライアントを常時接続したままにするにはperl/python/ruby拡張を使う必要があり、場合によっては動かない人もいるのでcurlコマンドとサーバ処理を行うperl部分以外は全てvimスクリプトで動くようにしました。
通信はXMLRPCJSONRPCを使っています。webapi-vimの最新版が必要です。もちろん無料です。
perl部分についてはXMLRPCJSONRPCを使うのでいくらかモジュールが必要です。README.mkdに書いてあります。DBDモジュールは個別で必要な物をインストールして下さい。
:VDBI
とするとデータソース/ユーザ名/パスワードを聞かれます。これはedbiと同じく、PerlのDBIモジュールの接続時パラメータになります。例えば以下の様な感じ。

SQLite

dbi:SQLite:dbname=/path/to/database/foo.db

MySQL

dbi:mysql:dbname=foo

PostgreSQL

dbi:Pg:dbname=foo

Oracle

dbi:Oracle:foo

data viewer

無事接続出来るとテーブル一覧が表示されます。各行でエンターキーを押すとカラムビューになります。またこの画面で <leader>s をタイプすると SQL 入力ウィンドウが表示されます。
入力中に <c-e> をタイプすると SQL が実行されてデータビューワに表示されます。

data viewer

この辺は edbi と同じ様な動きになっています。<c-r> をタイプするとヒストリが選べるので前に入力した SQL を呼び出す事も出来ます。上で説明したデータソースの履歴も同様です。

なかなかいいものが出来たかなーとは思いますが、内部処理を Pure Vimscript でやっている手前、あまり速くはありません。
もしかしたら JSON RPC に作り変えた方がいいかもしれない。まぁこの辺はおいおいやっていくつもりです。

宜しければどうぞー。
Posted at by



2012/03/01


Patch 7.3.461 が取り込まれて InsertCharPre が使えるレベルになりました。
これでようやく「おっぱい」しか入力出来ないVimが作れます。 scriptencoding utf-8
let s:oppai_a = split('おっぱい''\zs')
let s:oppai_n = 0
functions:oppai()
  let r = s:oppai_a[s:oppai_n]
  let s:oppai_n = (s:oppai_n + 1) % len(s:oppai_a)
  return r
endfunction
autocmd InsertCharPre <buffer> let v:char = s:oppai()
Posted at by



2012/02/14


Vimが無いと夜も安心して眠れないVimキチガイの皆さんこんにちわ。
Twitter
ShougoMatsu

そういえば、VimもMessagePackで通信できると面白いのではないか。


https://twitter.com/#!/ShougoMatsu/statuses/168691297601863681
こうですかわかりません。
mattn/msgpack-vim - GitHub

MessagePack implements for vim

https://github.com/mattn/msgpack-vim
Vim scriptは型が豊富ではないので、可逆圧縮ではありませんが簡単な物ならば動きます。
# -*- coding: utf-8 -*-
require 'msgpack/rpc'
class MyHandler
  def add(x,y) x+y end
end
svr = MessagePack::RPC::Server.new
svr.listen('0.0.0.0'18800MyHandler.new)
svr.run

こんなサーバを走らせておき let mp = msgpack#client("127.0.0.1"18800)
echo mp.call("add", 1, 2)
call mp.close()
Vimからこのように実行します。すると 3 おぉ... もちろん配列、ディクショナリ、浮動小数点、文字列、整数は当たり前で扱えます。
# -*- coding: utf-8 -*-
require 'msgpack/rpc'
class MyHandler
  def get_dict()
    {:foo => "ばー"}
  end
end
svr = MessagePack::RPC::Server.new
svr.listen('0.0.0.0'18800MyHandler.new)
svr.run
こんなコードなら let mp = msgpack#client("127.0.0.1"18800)
echo mp.call("get_dict")
call mp.close()
{'foo': 'ばー'} と表示されます。日本語もバッチリですね!

msgpack#client に関しては通信に vimproc を使ってますが、ここはちょっと弄れば nc でも通信可能ですし、xxd なんかを使えばバイナリファイルとしても保存可能です。 また msgpack#packmsgpack#unpack は単体関数として使えるのでいろんな物に利用出切るかと思います。

誰得度がかなり高いですが、よろしければどうぞ。
Posted at by