Как стать автором
Обновить

Продуктивная работа в vim с использованием snipMate

Время на прочтение4 мин
Количество просмотров10K
В этой статье я хочу рассказать об одном замечательном плагине для vim, который значительно ускоряет написание кода, вёрстку и редактирование текстов.

snipMate — позволяет быстро вставить в документ текстовый шаблон с помощью ключевого слова + <tаb> и предоставляет удобную навигацию по вставленному шаблону.


Установка

  • Качаем последнюю версию расширения — здесь.
  • Распаковываем архив.
  • Копируем содержимое в ~/.vim/
  • Плагин установлен.
Для работы расширения необходимо добавить в конфигурационный файл (vimrc) следующие строки:
set nocompatible
filetype on
filetype plugin on

Snippets


Текстовые шаблоны, которыми оперирует snipMate называются snippet-ами.
Для них отведена отдельная директория в папке ~/.vim с одноимённым названием.
В загруженном нами архиве имеется базовый набор шаблонов для различных языков программирования.

Давайте воспользуемся шаблоном для си-подобного цикла for, для этого в любом файле с расширением .c или .cpp нужно ввести в режиме вставки for<tаb> (<tаb> обозначает нажатие клавиши tab) и сразу же получим следующую конструкцию:
	for (i = 0; i < count; i++) {
		/* code */				
	}

Шаблон имеет 4 редактируемые зоны, между которыми можно переключаться с помощью клавиши tab (Shift + tаb для реверс-переключения)
	for (/*2*/ = 0; /*2*/ < /*1*/;  /*2*//*3*/) {
		/*4*/			
	}

Когда фокус переключается на следующую зону, эта зона выделяется, при этом мы находимся в режиме редактирования, то есть ввод нового текста полностью затирает старый.
Мы видим 3 экземпляра зоны /*2*/. Это значит, что при редактировании изменения применяются ко всем трем экземплярам.

Пример написания простого цикла:
"for<tаb> 100<tаb> myVar<tаb> +=10<tаb> //some" создаст следующий фрагмент кода:
	for (myVar = 0; myVar < 100; myVar+=10) {
		//some
	}


Вот как это выглядит на практике — видео.

Удобно? Решать вам.

Самое важное в этом плагине — его расширяемость. Мы можем разрабатывать собственные шаблоны и использовать их в полной мере.

Пишем собственный snippet


Как мы уже знаем, все snippet-ы лежат в ~/.vim/snippets
Следует заметить, что в скачанном нами архиве имеется файл «syntax/snippet.vim», а это значит, что нас будет радовать подсветка синтаксиса при редактировании snippet-файлов в нашем любимом редакторе.
  • Открываем snippets-файл для нужного нам языка.
    В нашем случае язык — C, следовательно файл — ~/.vim/snippets/c.snippets
  • Добавляем свой snippet, следуя синтаксису:
    snippet <ключевое слово>
    	<тело шаблона>

    Где <ключевое слово> — это слово, после которого нужно будет нажать tab, чтобы в итоге получить <тело шаблона>, причем нужно обязательно сделать отступ в одну табуляцию в первой строке шаблона. Для описания наших действий можем использовать строчные комментарии, которые начинаются с символа "#". Использование комментариев допускается только вне тела шаблона. Итак добавим:
    snippet hello
    	printf("Hello, world!");
    
  • Сохраняем файл. Открываем «foo.c» и проверяем наш snippet — вводим в режиме редактирования hello<tаb> — получаем printf(''Hello, world!'');.
Мы написали свой собственный snippet, но больно уж он простой и напоминает vim-овскую аббревиатуру. Поэтому давайте подробнее рассмотрим тело шаблона.

Expanded text


По умолчанию, после нажатия табуляции курсор устанавливается в конец шаблона.
  • Для установки курсора в нужное место можно воспользоваться конструкцией "${#}",
    где # — номер метки (tab stop), который определяет порядок перемещения при нажатии tab.
  • Текст по умолчанию может быть прикреплен к метке с помощью "${#:text}".
  • Чтобы получить эффект цепной реакции при изменении текста на некоторой метке, нужно воспользоваться конструкцией-переменной "$#", где # — номер уже используемой метки с текстом. Изменение текста некоторой метки влечет за собой изменение всех переменных, имеющих тот же номер, что и метка. Примером такой «цепной реакции» является цикл for, точнее изменение имени его переменной-счётчика.
Все перечисленные конструкции можно вкладывать друг в друга для достижения желаемого результата. Напишем шаблон простенькой функции, которая возвращает квадрат принятого аргумента.
snippet sq
	${1:int} $1_sqr($1 x){
		return x*x;
	} ${2}

А теперь применим его. Откроем «foo.c» и введём в режиме редактирования: sq<tаb> double
В результате получим:
double double_sqr(double x){
	return x*x;
}
Всего-то два слова и функция готова!

Шаблоны с вариантами


Очень полезным может оказаться определение шаблона с вариантами. Реализовать эту конструкцию можно следующим образом:
snippet <ключевое слово> <описание шаблона 1>
	<тело шаблона 1>

snippet <ключевое слово> <описание шаблона 2>
	<тело шаблона 2>

	...

snippet <ключевое слово> <описание шаблона N>
	<тело шаблона N>

Все описания шаблонов имеют одинаковое ключевое слово, но разную имплементацию. При попытке использования такого шаблона возникает диалог, в котором можно увидеть описания всех подходящих шаблонов и сделать выбор, введя нужный номер.
Давайте переопределим шаблон для функции из предыдущего примера:
snippet sq int_sqr
	int int_sqr(int x){
		return x*x;
	}
snippet sq double_sqr
	double double_sqr(double x){
		return x*x;
	}
snippet sq someType_sqr
	someType someType_sqr(someType x){
		return x*x;
	}

При вводе sq<tаb> в режиме редактирования получим следующий диалог:
1. int_sqr
2. double_sqr
3. someType_sqr
Type number and <Enter> or click with mouse (empty cancels): 

Теперь для получения функции достаточно ввести лишь одно слово и сделать выбор.

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


Шаблон может содержать в себе отрывок вим скрипта, который интерпретируется при вставке snippet-а в документ. Очень полезной может оказаться функция system(), которая выполняет внешнюю команду и направляет вывод в место вставки. Скрипт обязательно должен браться в ` ` (часто путают с ' ').
Давайте рассмотрим пример с использованием system():
snippet today
	Today is `system("date +%Y-%m-%d")`

При вставке получим: Today is YYYY-MM-DD

Комбинирование наборов шаблонов


Для активации snippet-ов из нескольких файлов при редактировании одного документа достаточно воспользоваться инструкцией:
:set ft=<currentFiletype>.<otherFiletype>
Следует заметить, что первым необходимо указывать тип текущего редактируемого файла, чтобы не потерять подсветку синтаксиса. К примеру для активации HTML шаблонов при редактировании *.c нужно сделать:
:set ft=c.html


Надеюсь эта стать окажется кому-нибудь полезной. Более подробную информацию о snipMate можно найти в файле ~/.vim/doc/snipMate.txt.

Ссылки


Официальная страница vim
Страница snipMate на vim.org
Демонстрационное видео
Теги:
Хабы:
Всего голосов 45: ↑43 и ↓2+41
Комментарии24

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань