Pull to refresh

vim + psql

Reading time3 min
Views5.1K
Уже пол года как перешели на 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> :)
йо
Tags:
Hubs:
+22
Comments23

Articles

Change theme settings