Git – концепции
Вот оно, доходчивое описание концепций Git.
3 месяца мучался с git, пока не прочитал таки, что там к чему. Без оного конечно как-то работалось, но любой шаг в сторону – и приходится искать какой-то магический рецепт. Так что рекоммендую, если испытываете сложности с осознанием? как и что делается в Git.
Solarized – это тема
Наткнулся на очень неплохую тему для vim – solarized. Классная она не только своими цветами, но и тем, что cуществует не только для vim, но и для некоторых других программ (Terminal, iTerm2, …). Она идет в двух вариантах – темном и светлом. Например в темноте удобно переключится на темный фон, чтобы глазам было легче, в светлое же время суток удобно использовать светлую тему.
Также для себя нашел удобным добавить в .vimrc две команды:
command! Light :set background=light command! Dark :set background=dark
Смысл, я думаю, очевиден: Dark включает темную тему, Light – светлую.
Множество картинок есть на сайте проекта – посмотрите. Если соберетесь скачивать, рекоммедую скачивать с github – там самая свежая версия.
iTerm2
iTerm2 – вот он, герой месяца!
Новый терминал для OSX.
Убойные фичи для меня:
1. Производительность
2. Сплит-панели
3. Глобальный shortcut (типа Visor)
4. Именование табов
Ну и много другого разного.
Правда не обошлось и без ковыряния руками – fullscreen прячет табы, их можно при этом вызывать удержанием кнопки CMD. Разработчик сказал, что так задумано и won’t fix. Так что на скорую руку отключил как мог, подкорячив файл PseudoTerminal.m в исходниках.
SCRUM от Джима
На прошлой неделе был на 2х дневном тренинге Джима Коплиена, посвященном SCRUM. Чёрт, это круто! Нужно сказать, что я до этого и читал, и слушал лекции о scrum. То есть для меня не была откровением сама практика. И, честно говоря, я относился к ней с очень большой долей скепсиса. И на тренинг тоже шел скептически настроенный, как и многие мои коллеги. Но Джим – это нечто! От самых основ. Почему так, а не иначе. Для чего, зачем… Короче, если вы всё еще не верите в scrum – вам к Джиму Коплиену.
Три киллер плагина для vim
Три плагина для vim, несущие функциональность классических IDE.
NERDTree – отображает дерево каталогов и файлов на манер окна проекта. Раньше я пользовался Project, но NERDTree выглядит мощнее и удобнее. (хотя project и имеет особенности, которых нету в NERDTree)
snipMate – позволяет вставлять шаблоны кода (сниппеты). Легко можно добавить свои сниппеты. В использовании прост и эффективен. Единсвенное, по-умолчанию для вставки сниппета использует клавишу TAB. У меня эта клавиша занята на автодополнение по словарю, которое я использую намного чаще. Поэтому, чтобы заменить клавишу вставки сниппета в snipMate, нужно в файле ~/.vim/after/plugin/snipMate.vim заменить строчки
ino <tab> <c-r>=TriggerSnippet()<cr> snor <tab> <esc>i<right><c-r>=TriggerSnippet()<cr>
например на следующие (ctrl+j вместо tab)
ino <c-j> <c-r>=TriggerSnippet()<cr> snor <c-j> <esc>i<right><c-r>=TriggerSnippet()<cr>
ConqueTerm – отображает шелл в буфере vim. Эту возможность я искал очень давно. В принципе, это позволило мне отказаться от терминала, как основного приложения для разработки. Теперь большинство задач можно делать прямо в vim, иметь все перед глазами, исользовать регистры vim и т.д. Для работы этого плагина требуется vim, поддерживающий python скрипты. MacVim и gVim делают это по-умолчанию, для консольного vim возможно потребуется переустановить его из исходников с опцией –enable-pythoninterp.
А на закуску хороший перевод отличной статьи «Coming Home to Vim» в двух частях: раз и два.
Реанимация
Решил реанимировать блог немного. Скорее всего буду продолжать писать небольшие околоайтишные заметки. А может и не только. Для начала вот вам немного музыки :)
http://static.video.yandex.ru/lite-audio/nikolajkrasov/64qifi3c09.311/
Заморозка
Спустя год работы в skype понимаю, что блог видимо обречен. Apex не занимаюсь вообще, www.erfree.com тоже, и времени в ближайшем будущем не предвидится. Если у кого-то есть интерес поднять упавшее знамя erfree.com, то с удовольствием подарю исходники.
У меня же есть много новых задумок и планов. Но, к сожалению, вряд ли они будут публиковаться на русском языке. Но зато, с большой вероятностью, они будут open source в рамках каких-то других проектов.
Название таба в terminal OSX
Наконец-то поборол проблему, которая не давала жить несколько месяцев.
Пошел четвертый месяц пользования макбуком. Всё в нем замечательно: и к OSX привык быстро и приложения все нужные есть, и коммандная строка в полной красе… О ней, собственно, речь и пойдет.
Я почти всё рабочее время провожу в консоли, где запущен vim. Консоли в OSX есть две: Terminal и iTerm. iTerm – суперская полностью настраиваемая консоль, Terminal попроще, но со своими прелестями. Реально, только одна вещь заставляет меня отказываться от iTerm – скроллинг в Vim работает чрезвычайно медленно. В Terminal при этом всё OK. Но в терминале нельзя давать вкладкам свои имена. А когда открыто больше 3х вкладок, то я начинаю путаться :) В поисках решения я уже даже screen умудрился приспособить в качестве таб-менеджера в терминале. Но там другая беда: vim окна иногда сбоят.
Кстати, чтобы из screen сделать таб-менеджер, достаточно в .screenrc добавить строчку:
caption always "%{= wb} %?%-Lw%?%{+b kg} %n. %t%f %?(%u)%?%{= wb}%?%+Lw%?"
Но решение таки нашлось. Это не совсем то что нужно, но всё равно лучше, чем ничего.
Дорабатываем sql_iabbr
Буквально недавно писал про капитализацию в vim.
Исключительно полезная вещь, но потребовала небольшой доработки. Кроме того, что добавил недостающих ключевых слов, доработал чуть-чуть функциональность.
Дело в том, что плагин срабатывает во всех файлах sql. А это не всегда хорошо: например, когда в файле находится процедура на plpython. Поэтому хорошо бы уметь на время отключать его. Для этого в исходном файле плагина нужно чуть-чуть изменить следующую функцию:
function! SqlIab_ReplaceConditionally(original, replacement)
if !exists("b:iabbr_disabled") || b:iabbr_disabled == 0
" only replace outside of comments or strings (which map to constant)
let elesyn = synIDtrans(synID(line("."), col(".") - 1, 0))
if elesyn != hlID('Comment') && elesyn != hlID('Constant')
let word = a:replacement
else
let word = a:original
endif
let g:UndoBuffer = a:original
return word
else
return a:original
endif
endfunction
Теперь отключать плагин можно коммандой:
:let b:iabbr_disabled=1
а включать обратно:
:let b:iabbr_disabled=0
Действует комманда только для текущего буфера.
dbext. Доработка напильником.
Что-то много стало появляться заметок по Vim. Заведу ка я отдельную рубрику.
На этот раз небольшая доработка плагина db_ext. Если кто не знает, то этот плагин позволяет выполнять запросы прямо из редактора Vim, получать описания таблиц, функций и т.п. Вобщем, этот плагин делает из vim вполне адекватную среду разработки. Может быть, позже напишу о нем подробнее. Однако в нем очень много недоделок, которые впринципе не критичны, но в повседневной работе раздражают.
Вот одна из них: при выполнении текущего запроса сам запрос определяется примерно следующим образом: от положения курсора в обратном направлении ищется ключевое слово SQL – это начало запроса, и от него берется весь текст до знака разграничителя запросов (точка с запятой например). Алгоритм конечно умный, но имеет ряд недостатков: они забыли некоторые ключевые слова (DROP например) – раз, и нельзя выполнить специфичный для конкретной базы запрос (комманду psql к примеру) – два.
Я бы предложил достаточно тупой алгоритм: просто брать текст между точками с запятой и надеятся что это и будет запрос. Чтобы это сделать, нужно переопределить функцию dbext#DB_getQueryUnderCursor. Для этого достаточно в файле autoload/dbext.vim в самый конец добавить строчку
source ~/.vim/autoload/dbext_improve.vim
И рядом, в папке autoload, создать файл dbext_improve.vim со следующим содержимым:
function! dbext#DB_getQueryUnderCursor()
" Mark the current line to return to
let curline = line(".")
let curcol = virtcol(".")
let startLine = search(';', 'bW')+1
call cursor(startLine, 0)
let endLine = search(';', 'W')
if endLine == 0
let endLine = line("$")
endif
let query = ''
for line in getline(startLine, endLine)
let query .= ' '.line
endfor
call cursor(curline, curcol)
return query
endfunction
Я не силен в vim скриптовании, поэтому не сильно заморачивался с определением разделителя запросов для текущей базы и прочими феньками, как это сделано в изначальной функции. Но такой вариант меня вполне устраивает.
И еще одна функция, которую стоит чуть подправить: dbext#DB_describeTable. Эта фукнция вызывает описание таблицы (аналог desc в sqlplus и \dt в psql). Если курсор установить на имя таблицы и вызвать её описание (\sdt) то появится спецификация таблицы. Проблема в том, что в текущей реализации берется только имя самой таблицы, без схемы. Для того чтобы работало со схемой, нужно в функции заменить всего лишь одно слово: cword на cWORD :) То же самое можно сделать в функциях dbext#DB_describeProcedure и dbext#DB_execSqlWithDefault.
