vim + psql

VIM*
Уже пол года как перешели на vim. Работаем с RoR(ruby on rails) и javascript (Dojo).
Vim попищал недельку и стал служить верой и правдой.
Подкупает простота и в тоже время мощь этого редактора, особенно в *nix окружении.

в этой заметке я раскажу как легко подружить vim и psql (postgresql console client).

Намного лирики:

*nix — конструктор, состоящий из множества кубиков
из этих кубиков вы можете творить :) — высшее удовольствие доступное смертным (бабло = зло)

кубики — это библиотеки и прежде всего утилиты, узкоспециалзированные программы с вылизанным кодом хорошо выполняющие свои функции.

кубик 1 -psql, консольный клиент для postgresql, работает примерно так:

user@host:/~$ psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

postgres=# \l -- список баз
postgres=# \c db_name -- приконектится к базе
postgres=# \d table_name -- описать таблицу
postgres=# select * from big_table; -- just sql

кубик 2 — vim, уникальный текстовой редактор, который прекрасно редактирует код.
Однако настроив взаимодействие с остальными утилитами вы можете превратить его в мощный инструмент.

Итак задача выполнять sql запросы к postgresql из vim.

Мы можем пердавать запросы psql не только интерактивно, но и через pipe. А результат перенаправлять в файл.

user@host:/~$ cat my.sql | psql > result.txt

В vim мы можем направит содержимое буффера в консольную утилиту.

:w!psql db_name > /var/temp/result.txt

Далее нам достаточно открыть этот файл в vim и мы получаем приблизительно то что хотели.

Оформим это в виде плагина — те положим в папочку .vim/plugin/ файл psql.vim с содержимым:

"simple vim integration with psql

"это простенькая функция, которая будет
"вытягивать аргументы для psql из первой строки файла
"она должна быть такого вида
" -- db:db_name or more arguments for psql
fun! s:get_db()
let s:db=(split(getline(1),":"))[1]
return s:db
endfun

"эта функция достает имя базы
"и направляет буффер на стандартный ввод psql
fun! PsqlPW()
let s:db=s:get_db()
exec 'w !psql '.s:db.' > ~/temp/sqlres'
"далее мы открываем файл с результатами
"в специальном preview окне для просмотра
ped ~/temp/sqlres
endfun

"эта функция берет строки между маркерами
" {{{ и }}}
" и далее направляет их содержимое все в тотже
"стандартный ввод psql
"позволяя выполнять разные запросы из одного файла
"также если для буффера стоит свойство foldmethod=marker
"блок запросов можно легко свернуть и развернуть (zc za)
"именно для этого мы выбрали {{{ }}} (see :h folding)
fun! PsqlLine()
let s:db=s:get_db()
normal $
let s:start_pos = search('{{{','bcnW')
let s:end_pos = search('}}}','cnW')
if s:start_pos!=0 && s:end_pos!=0
let s:cmd= ':'.s:start_pos.','.s:end_pos.'w !psql '.s:db.' > ~/temp/sqlres'
"echo cmd
exec s:cmd
ped ~/temp/sqlres
endif
endfun


Теперь для удобства использования этих функций добавим в папочку конфигураций еще один файл
.vim/ftplugin/sql.vim:

map <buffer> <F5> :call PsqlPW()<cr>
map <buffer> <cr> :call PsqlLine()<cr>
setlocal foldmethod=marker


Этот скрипт будет вызываться каждый раз, как вы открываете файл с типом sql и в результате —
по нажатию F5 вы выполните весь файл, а по Enter блок между {{{ }}}
Также вы можете фолдить эти блоки.

image

Tip: Хотите автозаполнение — простейший вариант попросить описание таблиц
\d table_name
и использовать стандартное vimовское <c-x><c-p> :)
йо
+22
11 июля 2009, 22:24
14
nicola 0,0

комментарии (23)

0
mitnlag #
Хотите сделать из vim emacs? :-P
0
thekiv #
Это бесполезно… У них разная философия ;)
0
nicola #
как раз наоборот — показать, что несколькими строчками скрипта из vim можно с удобством пользоваться тем что уже сделано — в частности psql. Далее я напишу как мы подружили vim с jslint :). ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ — сила *nix и vim.
+2
mitnlag #
Чудно, чудно! Что там с приготовлением кофе?
0
FloppyFormator #
Дело за малым: написать вменяемый драйвер для кофеварки.
0
Paul #
Не нужно драйвер. Достаточно, чтобы кофеваркой можно было управлять через комманд-лайн, через ssh например.
0
Fiery_Ice #
[бабло зло] но [бабло = ресурс]: нет бабла -> нет возможности купить комп/кисти/инструменты/что_угодно -> меньньше возможностей творить.
:)
0
nicola #
да но нестоит его ставить во главу — за деньги никогда так не напишешь как по вдохновению
+1
mitnlag #
кому-то деньги даруют вдохновение :-)

Понимаете, дело ведь не только в написании софта за бабло.
Дело еще в управлении баблом.
Бабло — власть, власть — наркота.

Фиг его знает, что я понаписал, я просто хочу сказать, что эйфорию можно вызвать в том числе и таблеткой ЛСД, купленной за деньги.
0
nicola #
творчество мой друг дает более стойкий результат :)
0
nicola #
проверено :)
0
mitnlag #
Ну я не знаю :-) Кушать-то хочется.
0
Fiery_Ice #
Естественно. А еще лучше, когда написанное по вдохновению еще и деньги приносит (а не так, что художник в нищете умирает, а через сто лет его работы за миллионы продаются к примеру).
:)
–1
garex #
Бабло — не зло. Бабло как раз добро.

А вот тупизм — зло.

ТУпизм * бабло = пипЕЕЕц.

А вот благие намерения * бабло = супердобро.
+4
DoctorDemon #
Не понял. Указатель типа ТУпизм?
0
garex #
Ага. Я как-то не подумал об этом варианте.

* — также является как бэ символом умножения.
0
Gibbzy #
чесное слово не знаю как автору, а мне кажется (судя по скриншоту) это не очень то и удобно и линуксах наверняка можно найти редакторы поприятнее
0
painEffect #
Этого скриншота катастрофически мало для того чтобы судить об удобстве Vimа
0
Flcn #
приятность это далеко не главное в редакторах ;) есть вещи и поважнее…
0
juchkov #
Итого суди по тексту вы не используете плейсхолдеры?
Так или я ошибаюсь?
0
nicola #
?
0
juchkov #
Спасибо, ответ понятен и все четко ставит на свои места.
0
painEffect #
А разве не проще воспользоваться dbext.vim? Есть приятная интеграция в rails.vim

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.