Code Snippets в Vim'e и пара полезный настроек.

Я расскажу о двух активно используемых мною плагинах, о которых на хабре вроде не писали, и о некоторых удобных лично для меня настройках: возможно, и еще кому-нибудь это окажется полезным.

Vim является моим основным редактором: сколько раз я не пытался пересесть на более модные «колеса», слезал с них уже через пару дней, но удобные методы работы с текстом, которые мне понравились, у них заимствовал, тем самым еще более убеждаясь, что Vim — наше всё.

Естественно, бользуюсь я большим кол-вом плагинов, но о многих из них уже рассказывали, я же поведаю о плагине SnippetsEmu и незаменимом для меня (да и для любого верстальщика, думаю) плагине Surround.

Note: По ходу написания статьи, я нашел и опробовал еще пару плагинов, о которых тоже вскользь упомяну.

SnippetsEmu



Этот плагин создан, чтобы воссоздать в Vim работу с code snippet'ами, как это реализовано в TextMate'е.

Установка.


1. Идем по ссылке: snippetsEmu и скачиваем два файла: snippy_plugin.vba (собственно, сам плагин) и snippy_bundles.vba (коллекцию сниппетов).

2. Создаем в домашней директории ~/.vim папки after/ftplugin.

cd ~/.vim
mkdir -p after/ftplugin


3. Открываем скачанные файлы в Vim (по очереди) и набираем в нем команду :so %

Использование.


Итак, у нас теперь есть сниппеты. Во-первых, стало доступно меню Snippets, в котором вы можете выбрать любой доступный тип. Во-вторых, они теперь автоматически подключаются в зависимости от типа файла.

По умолчанию сниппет активируется нажатием клавиши Tab, что лично для меня не очень удобно, поэтому я в своём .vimrc переопределил эту функцию на сочетание Ctrl-Space следующей командой:

let g:snippetsEmu_key = "<c-space>"


Все. Открываем файл, предположим html, пишем doctype, жмем Tab (или на что вы там его переопределили), и вуаля! Не магия, конечно, но приятно. Наберем html<Tab> и у нас развернется другой сниппет с плэйсхолдерами, по которым можно перемещаться также нажатием <Tab>.

Настраиваем.


Естественно, не все спиппеты будут вас устраивать, но это легко исправить. Все они хранятся в созданной вами ранее директории after/ftplugin. Начинается сниппет с команды exec "Snippet, затем пишем свое сокращение, а через пробел раскрываем полный код. Внимание: каждый сниппет должен быть написан на одной и только одной строке. Placeholder'ы создаются с помощью st (start tag) и et (end tag). Посмотрим на примере. Допустим, сделаем вот такую элементарную конструкцию:

public function <functionname>(<optional attributes>)
{
    <cursor>
}


Пишем сниппет:

exec "Snippet pubfun public function ".st."functionName".et."(".st.et.")<cr>{<cr>".st.et."<cr>}<cr>".st.et


Surround



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

Установка крайне проста: скопируйте surround.vim в ~/.vim/plugins, а surround.txt в ~/.vim/doc. Теперь вам доступны очень вкусные функции.

В normal mode:


ys — окружает слово (w), строку (s) и т.д.

Примеры:

ysiw" — окружает слово кавычками. Замените кавычки на тег, и слово будет окружено тэгом.
yss<h1> — заключает строку в тэг.
ys2w{ — заключает два слова в фигурные скобки.

ds — удаляет окружение.

Примеры:

dst — удаляет тэг.
ds( — удаляет круглые скобки

cs — заменяет одно окружение другим.

Примеры:

cst" — заменяет тэг на кавычки. (было <b>Hello</b>, стало «Hello»)
cs([ — заменяет круглые скобки на квадратные (было (ух ты какая штука), стало [ух ты какая штука])

В визуальном режиме.


s[символ] — окружает выделенный текст в тег или символ.

Наткнулся на еще один интересный плагин на тематику code snippet'ов:

snipMate.



Скачать: snipMate

Установка: просто распокавать в домашнюю директорию ~/.vim

mv snipMate.zip ~/.vim
cd ~/.vim
unzip snipMate.zip
rm snipMate.zip
mv convertSnip.py ~/bin


Скринкаст: vimeo.com/3535418

Общие впечатления сугубо положительные. Поработал с ним пока все лишь три часа (в промежутке между написанием статьи и её публикацией) и остался доволен до такой степени, что отключил описываемый мною выше плагин snippetsEmu.

Вот несколько пунктов, которые мне приглянулись в этом плагине:

1. Он живой. В том плане, что автор активно над ним работает (последняя версия была выпущена 3 дня назад).

2. Более понятный и лаконичный синтаксис самих сниппетов, достаточно войти в папку .vim/snippets, выбрать нужный вам тип файла, и вы без труда разберетесь в том, как написать свой сниппет.

3. Плэйсхолдеры имеют вид комментариев, поэтому, даже если вы их не заполните, код все равно останется работоспособным, в отличие от snippetEmu, что лично меня очень сильно напрягало.

4. Автозаполнение одинаковых плэйсхолдеров. Мелочь, но очень приятно. Особенно хорошо вы это сможете увидеть на примере цикла for на скринкасте.

В общем, очень приятный плагин. Буду им пользоваться и следить за его развитием.

Парочка полезных настроек



1. Во всех редакторах типа eclipse или netbeans есть автозакрытие скобок. Сделаем это и в Vim. Прописываем:

imap ( ()<left>
imap [ []<left>
imap {<cr> {<cr>}<esc>O


Иногда, правда, мы хотим вставить только одну скобку, для этого лично я использую комбинацию Alt-9 и Alt-[

imap <a-9> (
imap <a-[> [


Ну, а чтобы окружить что-то скобками, мы пользуемся описанным выше плагином.

2. Некоторые команды нормального режима было бы неплохо иметь в режиме вставки, такие, например, как удаление строки, дублирование строки, перемещение строки вверх или вниз, перемещение по коду. Для всех подобных задач я использую сочетания с Alt'ом.

imap <a-d> <esc>ddi       "удаление строки.
imap <a-p> <esc>pi        "вставляем раннее удаленную строку.
imap <a-w> <esc>ysiw"wea  "окружение одного слова в двойные кавычки. 
                                      "(вообще, разные окружения я прописываю 
                                      "для разного типа файлов, например, для 
                                      "html я использую самые частые теги и т.д.)
imap <a-h> <left>
imap <a-j> <down>
imap <a-k> <up>
imap <a-l> <right>
imap <a-down> <esc>ddpi   "перемещение строки вниз
imap <a-up> <esc>ddkPi    "перемещение строки вверх
imap <a-c> <esc>yypi      "дублирование строки


3. Переход в нормальный режим по esc уж очень неудобен. Я все ещё нахожусь в поисках альтернативы, но пока использую сочетание Alt-q, но теперь после того, как я удалил плагин snippetsEmu, возможно попробую пожить с сочетанием <C-Space>

imap <C-Space> <esc>


4. Часто возникает желание напечатать что-либо сверху или снизу строки, на которой вы находитесь, но если там нет места, то приходится перемещаться в конец строки и жать enter, либо пользоваться мышкой или клавишами вверх-вниз. Решаемо:

imap <c-cr> <esc>o
imap <c-s-cr> <esc>O


5. Неудобство автоматических скобок в том, что нет никаких способов (обычно) перемещаться за них, предположим, чтобы поставить точку с запятой, или во вложенных скобках, когда вам нужно перейти за текущую открытую скобку, опять-таки приходится пользоваться мышкой.

imap <a-4> <esc>$a           "перемещаемся в конец строки, если вы хотите просто 
                        "поставить точку с запятой и продолжить,
                        "то можно сделать дополнительную комбинацию: 
                        "imap <a-;> <esc>$a;<cr>
imap <c-c> <esc>/)<cr>a "перемещаем курсор за ближайшую закрывающуюся скобку.


Заключение.



Естественно, все эти настройки сугубо индивидуальны и о них можно спорить бесконечно, особенно по поводу того, какие именно сочетания клавиш назначать. Например, <c-c> многими используется для других целей или, возможно, вы пользуетесь сочетаниями с альтом, чтобы печатать особые символы (я для эти целей предпочитаю пользоваться digraph'ами (<c-k>)). В этом и прелесть Vim'a — его можно настроить под собственных вкус и потребности.

Пожалуй, на этом и закончу. Спасибо за уделённое время, надеюсь, что статья окажется вам полезной. Это моя первая публикация на хабре (и надеюсь, что не последняя), поэтому я с радостью выслушаю замечания и комментарии о том, как ее улучшить. Ну, а пока пойду искать новые плагины и способы настройки этого замечательного редактора.

Happy Vimming! :-)
Tags:
vim, editor, plugin, code, snippets

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.