h0rr0rr_drag0n 23.11.2010 23:25
Vim — Плагин code_complete для Vim'a - автодополнение и сниппеты
Практически во всех современных средах разработки есть пара удобных возможностей - есть возможность видеть список параметров функции, введя имя этой функции и открывающую скобку, и автодополнение стандартных блоков кода, наподобие if () {} else {} и других.Естественно, подобная функциональность не могла обойти стороной и текстовый редактор Vim (который, стоит отметить, являет собой нечто большее, чем просто текстовый редактор). Сниппеты и автодополнение параметров функций можно найти во множестве плагинов, лежащих на vim.org.
В своей статье, я хочу рассмотреть один плагин, в котором уже реализованы и сниппеты и автодополнение. Плагин называется code_complete (new update).
Установка плагина предельно проста и выполняется через VimBall - открывается файл plugin_name.vba и выполняется команда :so %. Все.
Автодополнение в плагине работает по хоткею , в отличие от плагина code_complete, в котором почему-то использовалась клавиша . Естественно, хоткей можно поменять - этот процесс описан в прилагаемой документации.
Кроме того, в рассматриваемом плагине достаточно удобно менять внешний вид используемых сниппетов. Меня, как любителя фигурных скобочек на той же строке, что и ключевое слово или имя функции, не устраивала позиция создателя code_complete, который считал, что фигурные скобочки должны располагаться на следующей строке. Естественно, я поменял поведение плагина на требуемое мне.
Шаблоны сниппетов располагаются в файле ~/.vim/plugin/default_snippets.template. Шаблоны для C и C++ начинаются с 64 строки и кончаются на 84. Если вы такой же приверженец "фигурных скобочек на текущей строке" как и я, то просто замените содержимое строк с 64 по 84 вот этим:
Теперь о том, как работать с этим плагином. Для вставки сниппета нужно напечатать его начало (например switch) и нажать . Сниппет раскроется и для перехода между полями в нем, нужно еще раз нажать вышеприведенную комбинацию клавиш. Выглядит это примерно так:
С автодополнением параметров функций все несколько сложнее - нам потребуется утилита ctags. При помощи этой утилиты нужно сгенерировать tags-файл для текущего проекта, в котором будут имена и параметры переменных, функций и т.п. Можно делать это самому, по хоткею:
А можно использовать специальный плагин indexer, который будет делать это автоматически, при изменении файлов проекта.
Итак, допустим tags-файл уже сгенерирован. Печатаем function_name( , нажимаем и получаем:
Вот и все основные возможности плагина. Приятного использования.
Ссылка на страницу плагина.
По материалам блога Дракон-линуксоид
time2die 24.11.2010 00:12 #
+ 0 -
то что доктор прописал
Да, какое-то время юзал code_complete, но потом перешёл на snipMate и обратно не тянет.
А как snipmate осуществляется навигация по сниппету? Меток то в нём вроде бы нет.
В смысле, навигация?
Набираешь ключевое слово, жмёшь tab ? срабатывает подстановка сниппета, если в нём есть плейсхолдеры, то будет выделен первый и можно сразу набирать текст, каждое нажати таба ? переход на следующий плейсхолдер. Плейсхолдеры могут быть именованными, тогда при изменении текста в плейсхолдере в одном месте автоматом меняется текст во всех плейсхолдерах с тем же именем по всему сниппету. Например возможен такой сниппет:
Я набираю в си-файле for, жму таб и получаю такое:
и у меня уже выделена переменная «i». Я набираю какой-нить текст (например «foobar»), и по всему сниппету имя переменной тоже меняется. Потом жму таб и попадаю на count. И т.д.
Набираешь ключевое слово, жмёшь tab ? срабатывает подстановка сниппета, если в нём есть плейсхолдеры, то будет выделен первый и можно сразу набирать текст, каждое нажати таба ? переход на следующий плейсхолдер. Плейсхолдеры могут быть именованными, тогда при изменении текста в плейсхолдере в одном месте автоматом меняется текст во всех плейсхолдерах с тем же именем по всему сниппету. Например возможен такой сниппет:
snippet for
for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) {
${4:/* code */}
}
Я набираю в си-файле for, жму таб и получаю такое:
for (i = 0; i < count; i++) {
/* code */
}
и у меня уже выделена переменная «i». Я набираю какой-нить текст (например «foobar»), и по всему сниппету имя переменной тоже меняется. Потом жму таб и попадаю на count. И т.д.
А что будет если внутрь сниппета вставить ещё один? Навигация по сниппету верхнего уровне поломается или будет работать?