while ("im the true Vim master");

2008-07-16

続・SQLファイルを実行するだけ

| 16:30

function! s:ExecSqlFile()
    let rslt = tempname()
    let src = expand("%:p")
    silent execute "!sqlplus <ユーザ>/<パスワード>@<SID> < " . src . " > " . rslt
    silent execute ":pedit! " . rslt
    wincmd P
endfunction
:map <silent> <F12> :call <SID>ExecSqlFile()<CR>
はてなブログ

nnoremap <silent> <F12>  :<C-u>new \| execute 'read !sqlplus {user}/{password}@{SID} <"%:p"' \| 1 delete _<Return>

  • コマンドにコロンを前置する必要はない(:mapと:pedit)。
  • :callには<C-u>を前置してないと誤ってカウント付きで実行したときに困る。
  • remapが必要なケースではないので:mapを使うべきではない。
  • この手のショートカット的なキーの割り当ては、ややこしい副作用を考えなくてもいいNormal modeのみに限定すべき。
  • 一時ファイルrsltを作るのは良いが削除していない。
  • コマンドの実行結果の取り込みには:read !{cmd}が使える。
  • %については:help :_%を参照。

余談: 原文中の<SID>はSession IDかなにかでしょうか。Vim用語としての<SID>にしか見えませんでした。

追記

うあー、ねぼけてますね。すいませんすいません。あれじゃ動きません。何故なら:read !{cmd}中の%は<F12>を押したときのカレントバッファ名ではなく、結果表示用に作成したバッファ名に展開されるからです。ただそれは無名バッファなので展開しようがなくエラーになります。正しくは以下の通り:

nnoremap <silent> <F12>  :<C-u>call <SID>execute_sql()<Return>
function! s:execute_sql()
  let _ = tempname()
  silent execute 'write !sqlplus {user}/{password}@{SID} >"'._.'"'

  new
  read `=_`
  1 delete _

  call delete(_)
endfunction

*nixなら:write !{cmd}中のリダイレクトは2>&1 >にした方が安心できるかな。

mitszomitszo2008/07/16 18:33添削ありがとうございます!
まだ添削していただいてる用語もよくわからん状態ですが勉強させていただきます。
<SID>ですが、Oracleで接続文字列をあらわすときに"SID"と表記することが多いのです。

mitszomitszo2008/07/16 23:31重ね重ねありがとうございます。
よくわからないまま真似てたところに解説していただいたことで勉強するとっかかりがたくさんできました (^^

最近のコメント
あわせて読みたいブログパーツ
AX