Vim Advent Calendar 2012 ujihisa 7
Posted at 2013/03/26ツイート
Vim Advent Calendar 2012 の116日目の記事です。 昨日はtyruさんによるvim-jpがつないだVimプラグイン開発者とVimパッチ職人&運用者、もしくはなぜ最近Vimコミュニティが活発になったのかでした。この流れをまさに体感しているVim世代としては、とても胸が熱くなり、感極まってきました。
さて、前回以下のような出来事があったのを覚えていらっしゃるでしょうか。
SimCityを無事入手し、それをGentoo Linux上のWineで動作させるため数日間悪戦苦闘し、結局諦めてWindowsを購入しました。しかしオンボードのIntel HD 3000では動作速度が遅く、いまはグラフィックボードの購入を真剣に検討しています。Gentoo Linuxとデュアルブートする予定なので、LinuxからちゃんとGPGPUに使えるようなものにしたいですね。
というわけで購入しました。Radeon HD 7850 (2GB RAM) というやつです。ビデオカード業界には全く詳しくなく、調査するのにとても時間がかかりました。Video CardのVはVimのVです。我々はもっとこの分野にも精通する必要があるのではないか、と感じました。
なお、SimCityのマルチプレイの協力者を募集しています。詳しくはLingrのVim部屋にて。
VimでSQLする
Vim Advent Calendar 2011にはQuickRunからSQLを実行するための設定(MySQL用)という記事がありました。今回のVim Advent Calendar 2012にはまだSQL系の記事はないようなので、最新版の情報をまとめていきたいと思います。
上記記事ではMySQLを用いていましたが、今回はPostgreSQLでいきましょう。Herokuなどで使えます。
quickrunとの連携
上記記事の時点ではquickrunは公式にはSQLをサポートしておりませんでしたが、つい先日公式にサポートされました。このpullreqを送った人はgoodjobです。(なお、個人的にvimrcでquickrunの設定をしている方、内容に汎用性があるなら本家にpullreqを送りましょう。みんなにとって便利になります。)
デフォルトの設定ですと、quickrunを発動すると
$ psql -f 編集中ファイルのファイル名
を実行したのと同じような感じになります。これですとリモートのPostgreSQLに接続できませんし、ユーザ名も指定できません。
接続先の指定やユーザ名の指定をそれぞれ個別に管理してもよいのですが、QuickRunはより薄いラッパであるべきです。ここは単にcmdoptを指定しましょう。(詳しくは:h quickrun-option-cmdopt
参照のこと。)
:QuickRun -cmdopt '-u postgres -h example.com'
一回しか実行しないならばこれがわかりやすいですね。が、同じバッファで何度も実行するかもしれません。そのときはb:quickrun_config
の出番です。
:let b:quickrun_config = {'cmdopt': '-u postgres -h example.com'}
これで繰り返し使えます。一方、ほとんど常に上記オプションを有効にしたいときは、思い切ってデフォルトにしてしまうのも一つの手です。~/.vimrc
に
let g:quickrun_config = {} " もしまだよそでg:quickrun_configを設定していないならば。
let g:quickrun_config.sql = {'cmdopt': '-u postgres -h example.com'}
これでよさそうです。
例えば著者はこのような設定をしています
let g:quickrun_config['sql/postgresql'] = {
\ 'cmdopt': '-h 0.0.0.0 mydb postgres'
\ }
neosnippetとの連携
quickrunで使うなら、とりあえず仮のテーブルを作って、ごにょごにょし、その後すぐ削除する、といった一連の動作を書きたくなるシーンが多いのではないでしょうか。定型句を何度も書くのは苦痛です。ただでさえSQLは大文字の連続で小指が痛くなるわけで、折角quickrunを使っていてもquickとはかけ離れたものになってしまいます。
定型句、という言葉が来たら、即座に「それneosnippetでできるよ」と答えるのがモダンVim使いと呼ばれて久しいです。neosnippetはSQLも公式にサポートしています。 このコミットをした人はgoodjobです。
cとまで入力すると補完候補に”CREATE_TABLE”とでてくるようになります。それを選択すると
CREATE TABLE <{1:cities}> (
<`0:name varchar(80), country_name text`>
);
DROP TABLE <|1|>;
ここまで展開されます。あとはジャンプしてプレースホルダを埋めるだけです。
罠とその回避法
quickrunのcmdoptに@という文字を使う場合エスケープが必要です。また、エスケープにもエスケープが必要です。「@を見たらバックスラッシュを3つつける」と覚えておけばだいたい大丈夫でしょう。
よくない例
:let b:quickrun_config = {'cmdopt': 'postgres://user:pass@host/db'}
よい例
:let b:quickrun_config = {'cmdopt': 'postgres://user:pass\\\@host/db'}
まとめ
sql用の無名バッファを開いてその場でサーバへの接続情報を設定し、neosnippetを駆使してコードを即座に書きあげ、quickrunで実行するまでをまとめたgif動画がこちらになります。
おまけ
LingrのVim部屋にPostgreSQLを使うためのLingr Botを配置しました。quickrunのかわりに、Vimからlingr.vimやJ6uil.vimを経由して任意のSQL式を記述し実行でき、便利です。
今後の課題
neosnippetのsql用のスニペットはまだまだ不十分です。皆様からの貴重なpull requestを楽しみにしています!
ujihisaもどる
blog comments powered by Disqus