追記 : 改良版の記事があります

昨日まで3日続けてpgAdminからRコンソールと連携するためのショートカットを試し、複数行のRのコマンドも自動選択して実行するまで一応なりました。そう言えば本来の用途であるSQLについて、複数行にまたがる一つのSQLを簡単に選択するメニューやショートカットがデフォルトでは存在しません。

例は何でもいいですが、例えば下のような複数行のテーブル定義クエリ(PostGISに付属の空間参照系)のCREATE TABLE文をサクッと選択できるといいなーと思い、昨日までと同様AutoHotkeyを使って簡単なスクリプトを作ってみました。実行環境はWindows 7 32bit + AutHotkey Unicode 32bit 1.1.20 + pgAdmin Portable 1.20.0。

デモ動画
ソースコードは後掲します。例によって動画にキーボード入力が映ってなく、文字も小さいので伝わりにくいですが、最初にAutoHotkeyスクリプトを起動し、クエリツール上の適当な所にカーソルを置き、全てショートカットキー(とりあえずCtrl+Shift+A)だけでSQLを自動選択しています。下に動画が出ない場合はブラウザが未対応なので、リンクからダウンロードして下さい。(526日追記:Chromeで正常再生できる動画に差し替えました)
≫ Link : demo_pgadmin_select_current_sql.webm

動画を見れば分かるとおり、複数行にまたがるSQLの先頭近くにカーソルがあると比較的すばやく選択されますが、終端寄りにカーソルがあると遅いです。まず先頭を確定するために一行ずつ遡り、次に一行ずつ戻って終端を探すという二度手間になり、もっと長いSQLなら手動の方が早いという…。

動画を撮ってから気付きましたが、先頭まで遡る時に行数をカウントしておき、戻る時にそれを使えば少し改善しそう。作業したら別途記事にします。またSQLの先頭・終端の確定は、単純にセミコロンだけで判断しています。そのため、文字リテラルやコメント内にセミコロンがあるとうまく動きません。このへんの詰めも、処理速度を改善できたら考える予定。

実行環境とスクリプト
スクリプト以外に準備したものは、昨日までと同じ。AutoHotkeyこちらからUnicode 32bitZIPをダウンロードし、本体のプログラムだけ適当なフォルダに解凍します。同じ場所に起動用バッチファイルとスクリプトを置いて準備終わり。必要な時にバッチをダブルクリックすればスクリプトが常駐し、pgAdminクエリツール上でショートカットキー(Ctrl+Shift+A)が機能します。
loading from Bitbucket...
loading from Bitbucket...
スクリプトの最後にある関数CheckRow()が、セミコロンの有無などを見てSQLの区切りかどうかを判断する部分。文字カーソルを1行ずつ上げ下げするたびにこの関数を呼び出してチェックしていますが、先ほど書いたとおり先頭行へ遡る時に行数をカウントしておけば、戻る時の関数呼び出し回数を減らせるので、それが出来たら上のソースコードは無用になります。とりあえず今日は、最初のとっかかりまで。