В этой статье я хочу рассказать об одном замечательном плагине для vim, который значительно ускоряет написание кода, вёрстку и редактирование текстов.
snipMate — позволяет быстро вставить в документ текстовый шаблон с помощью ключевого слова + <tаb> и предоставляет удобную навигацию по вставленному шаблону.
Текстовые шаблоны, которыми оперирует snipMate называются snippet-ами.
Для них отведена отдельная директория в папке ~/.vim с одноимённым названием.
В загруженном нами архиве имеется базовый набор шаблонов для различных языков программирования.
Давайте воспользуемся шаблоном для си-подобного цикла for, для этого в любом файле с расширением .c или .cpp нужно ввести в режиме вставки for<tаb> (<tаb> обозначает нажатие клавиши tab) и сразу же получим следующую конструкцию:
Шаблон имеет 4 редактируемые зоны, между которыми можно переключаться с помощью клавиши tab (Shift + tаb для реверс-переключения)
Когда фокус переключается на следующую зону, эта зона выделяется, при этом мы находимся в режиме редактирования, то есть ввод нового текста полностью затирает старый.
Мы видим 3 экземпляра зоны /*2*/. Это значит, что при редактировании изменения применяются ко всем трем экземплярам.
Пример написания простого цикла:
"for<tаb> 100<tаb> myVar<tаb> +=10<tаb> //some" создаст следующий фрагмент кода:
Вот как это выглядит на практике — видео.
Удобно? Решать вам.
Самое важное в этом плагине — его расширяемость. Мы можем разрабатывать собственные шаблоны и использовать их в полной мере.
Как мы уже знаем, все snippet-ы лежат в ~/.vim/snippets
Следует заметить, что в скачанном нами архиве имеется файл «syntax/snippet.vim», а это значит, что нас будет радовать подсветка синтаксиса при редактировании snippet-файлов в нашем любимом редакторе.
По умолчанию, после нажатия табуляции курсор устанавливается в конец шаблона.
А теперь применим его. Откроем «foo.c» и введём в режиме редактирования: sq<tаb> double
В результате получим:
Очень полезным может оказаться определение шаблона с вариантами. Реализовать эту конструкцию можно следующим образом:
Все описания шаблонов имеют одинаковое ключевое слово, но разную имплементацию. При попытке использования такого шаблона возникает диалог, в котором можно увидеть описания всех подходящих шаблонов и сделать выбор, введя нужный номер.
Давайте переопределим шаблон для функции из предыдущего примера:
При вводе sq<tаb> в режиме редактирования получим следующий диалог:
Теперь для получения функции достаточно ввести лишь одно слово и сделать выбор.
Шаблон может содержать в себе отрывок вим скрипта, который интерпретируется при вставке snippet-а в документ. Очень полезной может оказаться функция system(), которая выполняет внешнюю команду и направляет вывод в место вставки. Скрипт обязательно должен браться в ` ` (часто путают с ' ').
Давайте рассмотрим пример с использованием system():
При вставке получим: Today is YYYY-MM-DD
Для активации snippet-ов из нескольких файлов при редактировании одного документа достаточно воспользоваться инструкцией:
Надеюсь эта стать окажется кому-нибудь полезной. Более подробную информацию о snipMate можно найти в файле ~/.vim/doc/snipMate.txt.
Официальная страница vim
Страница snipMate на vim.org
Демонстрационное видео
snipMate — позволяет быстро вставить в документ текстовый шаблон с помощью ключевого слова + <tаb> и предоставляет удобную навигацию по вставленному шаблону.
Установка
- Качаем последнюю версию расширения — здесь.
- Распаковываем архив.
- Копируем содержимое в ~/.vim/
- Плагин установлен.
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!'');.
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
Демонстрационное видео