Сегодня будем дружить Vim c SQL*Plusом. Для этого нам понадобится сущая безделица, такая вот функция:
function! SqlPlus()
let l:fname = @%
let l:sqlbuf = bufnr("%")
if !exists("b:oraext_conn")
let b:oraext_conn = ""
endif
let b:oraext_conn = input("Connect string: ",b:oraext_conn)
echo "Executing..."
let l:cmd = ":%! sqlplus ".b:oraext_conn." @".shellescape(l:fname)
if !exists("b:oraext_resbuf") || !bufexists(b:oraext_resbuf) || bufwinnr(b:oraext_resbuf) == -1
new
else
exe bufwinnr(b:oraext_resbuf)."wincmd w"
if &modified
new
else
exe "normal ggdG"
endif
endif
exe l:cmd
setlocal nonu
set nomodified
set efm=%-Poraext:\ fname=%f,%A%l/%c%m,%C%\\t%m
cgetexpr ["oraext: fname=".fnameescape(l:fname)] + getline(1,'$')
let l:resbuf = bufnr("%")
exe bufwinnr(l:sqlbuf)."wincmd w"
let b:oraext_resbuf = l:resbuf
cc
redrawstatus
endfunction
Небольшой комментарий_к. Допустим, сочиняем мы PL/SQL-пакет (кстати, на картинке видно, как мой плагин подсвечивает if, на котором стоит курсор):
Чтобы прогнать пакет через Плюс, говорим :call SqlPLus(). Естественно, это не надо набирать каждый раз. Во-первых, в ex-режиме (после нажатия двоеточия) работают стрелки вверх-вниз по
истории команд, а также автокомплишн по табуляции, как в шелле. Во-вторых, можно просто повесить эту команду на какую-нибудь кнопку.
Первый раз у нас спросят строку соединения. Затем, после небольшой
паузы, появится окошко с Плюсовым выводом. Если были ошибки, курсор будет
позиционирован на первой из них, а командами :cn и :cp
можно перемещаться к следующей или предыдущей (это vimовская фича™ quickfix, :help quickfix).
А что ещё надо от IDE? Самую малость: в следующий раз буду дружить Vim со своей OCI-программой, чтобы прямо из редактора выполнять запросы.
P. S. Кстати, вот отличная статья на тему продвинутых® IDE и удовольствия от кодирования™: Does Visual Studio Rot the Mind?