Естественно, подобная функциональность не могла обойти стороной и текстовый редактор Vim (который, стоит отметить, являет собой нечто большее, чем просто текстовый редактор). Сниппеты и автодополнение параметров функций можно найти во множестве плагинов, лежащих на vim.org.
В своей статье, я хочу рассмотреть один плагин, в котором уже реализованы и сниппеты и автодополнение. Плагин называется code_complete (new update).
Установка плагина предельно проста и выполняется через VimBall - открывается файл plugin_name.vba и выполняется команда :so %. Все.
Автодополнение в плагине работает по хоткею <Alt+d>, в отличие от плагина code_complete, в котором почему-то использовалась клавиша <Tab>. Естественно, хоткей можно поменять - этот процесс описан в прилагаемой документации.
Кроме того, в рассматриваемом плагине достаточно удобно менять внешний вид используемых сниппетов. Меня, как любителя фигурных скобочек на той же строке, что и ключевое слово или имя функции, не устраивала позиция создателя code_complete, который считал, что фигурные скобочки должны располагаться на следующей строке. Естественно, я поменял поведение плагина на требуемое мне.
Шаблоны сниппетов располагаются в файле ~/.vim/plugin/default_snippets.template. Шаблоны для C и C++ начинаются с 64 строки и кончаются на 84. Если вы такой же приверженец "фигурных скобочек на текущей строке" как и я, то просто замените содержимое строк с 64 по 84 вот этим:
Теперь о том, как работать с этим плагином. Для вставки сниппета нужно напечатать его начало (например switch) и нажать <Alt+d>. Сниппет раскроется и для перехода между полями в нем, нужно еще раз нажать вышеприведенную комбинацию клавиш. Выглядит это примерно так:
С автодополнением параметров функций все несколько сложнее - нам потребуется утилита ctags. При помощи этой утилиты нужно сгенерировать tags-файл для текущего проекта, в котором будут имена и параметры переменных, функций и т.п. Можно делать это самому, по хоткею:
А можно использовать специальный плагин indexer, который будет делать это автоматически, при изменении файлов проекта.
Итак, допустим tags-файл уже сгенерирован. Печатаем function_name( , нажимаем <Alt+d> и получаем:
Вот и все основные возможности плагина. Приятного использования.
Ссылка на страницу плагина.
Установка плагина предельно проста и выполняется через VimBall - открывается файл plugin_name.vba и выполняется команда :so %. Все.
Автодополнение в плагине работает по хоткею <Alt+d>, в отличие от плагина code_complete, в котором почему-то использовалась клавиша <Tab>. Естественно, хоткей можно поменять - этот процесс описан в прилагаемой документации.
Кроме того, в рассматриваемом плагине достаточно удобно менять внешний вид используемых сниппетов. Меня, как любителя фигурных скобочек на той же строке, что и ключевое слово или имя функции, не устраивала позиция создателя code_complete, который считал, что фигурные скобочки должны располагаться на следующей строке. Естественно, я поменял поведение плагина на требуемое мне.
Шаблоны сниппетов располагаются в файле ~/.vim/plugin/default_snippets.template. Шаблоны для C и C++ начинаются с 64 строки и кончаются на 84. Если вы такой же приверженец "фигурных скобочек на текущей строке" как и я, то просто замените содержимое строк с 64 по 84 вот этим:
let a:dict['if'] = "if (".s:dr.") {\<cr>".s:dr."\<cr>}\<cr>".s:dr let a:dict['else'] = "else {\<cr>".s:dr."\<cr>}\<cr>".s:dr let a:dict['while'] = "while (".s:dr.") {\<cr>".s:dr."\<cr>}\<cr>".s:dr let a:dict['do'] = "do {\<cr>".s:dr."\<cr>}\<cr>while (". \ s:dr.");\<cr>".s:dr let a:dict['for'] = "for (".s:dr."; ".s:dr."; ".s:dr.") {\<cr>". \ s:dr."\<cr>}\<cr>".s:dr let a:dict['case'] = "case ".s:dr.":\<cr>".s:dr."\<cr>\<bs>break;". \ "\<cr>\<bs>".s:dr let a:dict['switch'] = "switch (".s:dr.") {\<cr>\<bs>".a:dict['case']. \ "\<cr>\<bs>\<bs>\<bs>\<bs>\<bs>\<bs>\<bs>default:\<cr>".s:dr."\<cr>}\<cr>".s:dr let a:dict['struct'] = "struct ".s:dr." {\<cr>".s:dr."\<cr>}".s:sr(';') let a:dict['printf'] = 'printf("\n", '.s:sr('args').");\<c-\>\<c-n>F\\i". \ "\<c-r>=SkipMarks()\<cr>" let a:dict['malloc'] = "\<c-r>=GetInput('input type you want to malloc:',". \ "'ma_type')\<cr>(\<c-r>=ma_type\<cr>*)malloc(".s:sr('len'). \ " * sizeof(\<c-r>=ma_type\<cr>));" let a:dict['calloc'] = "\<c-r>=GetInput('input type you want to calloc:',". \ "'ma_type')\<cr>(\<c-r>=ma_type\<cr>*)calloc(".s:sr('len'). \ ", sizeof(\<c-r>=ma_type\<cr>));"
Теперь о том, как работать с этим плагином. Для вставки сниппета нужно напечатать его начало (например switch) и нажать <Alt+d>. Сниппет раскроется и для перехода между полями в нем, нужно еще раз нажать вышеприведенную комбинацию клавиш. Выглядит это примерно так:
Вводим начало сниппета |
После нажатия |
Переходим между полями и заполняем их |
В конце продолжаем писать основной код программы |
С автодополнением параметров функций все несколько сложнее - нам потребуется утилита ctags. При помощи этой утилиты нужно сгенерировать tags-файл для текущего проекта, в котором будут имена и параметры переменных, функций и т.п. Можно делать это самому, по хоткею:
"Автоматическая индексация проекта утилитой ctags imap <C-c>ct <Esc>:!ctags -R --c++-kinds=+p --c-kinds=+p --fields=+iaS --extra=+q --languages=c++,c .<CR> nmap <C-c>ct :!ctags -R --c++-kinds=+p --c-kinds=+p --fields=+iaS --extra=+q --languages=c++,c .<CR>
А можно использовать специальный плагин indexer, который будет делать это автоматически, при изменении файлов проекта.
Итак, допустим tags-файл уже сгенерирован. Печатаем function_name( , нажимаем <Alt+d> и получаем:
Автодополнение параметров функции |
Ссылка на страницу плагина.