Тут много, что не назвали. Поскольку на ЛОРе об этом и без того много написано. А tagbar, да, хорош, но необязателен.
Еще тут забыли про nerdtree и nerdcommenter. А так же про ctrlp - вот это вещь отличная. Ну и мануал по vim тоже рулит - и без плагинов vim умеет многое.
inccomplete - моя поделка для дополнения #include директив
Если поискать, то в репозитории ещё есть (многое в куче в vimrc):
частичная поддержка синтаксиса C++11 собранная по кускам из нескольких источников
abbreviations «#d», «#i», «#p»
сочетания для grep'ания слов по всем файлам C и C++ в текущей директории и ниже (может подняться на уровни выше до каталога с именем src)
сочетание <leader>v для выделения куска выражения в отдельную переменную (взято из одного из Vim-tips)
автоматическая перегенерация файлов тэгов, для этого есть специальные плагины, но меня и так полностью устраивает
настройки приоритетов файловых расширений для плагина fswitch
несколько ultisnips снипетов для C/C++/C++11
<leader>r... сочетания для переименования (не интеллектуального)
поиск TODO и FIXME
в bundle/srctemplate есть возможно интересные псевдо-шаблоны для C и C++ позволяющие автоматизировать вставку header'а и footer'а, и копирование инклюдов при создании новых файлов заголовков и исходников
функция для подсчёта количества строк в функции (зависит от расположения фигурных скобок)
Документировано там далеко не всё, да и довольно плохо организовано, но если порыться, то думаю, можно что-то интересное для себя найти.
ifdef.vim - подсветка активных/неактивных условных блоков (сложные условия не поддерживаются)
Судя по описанию, вложенные блоки поддерживаются - «Handles nesting of #ifdefs (and #if) as well», но «but does not handle #if defined()», а я привык писать #if defined().
errormarker - помечает ошибки/предупреждения компиляции используя signs
О, за это спасибо. Удобная штука.
commentary - KISS плагин для комментирования/разкомментирования кода
Чем он лучше nerdcommenter?
fswitch - переключение между cpp и hpp файлами
Пробовал его только ради protodef. Но, поскольку, последний у меня не работает, откатился на a.vim
inccomplete - моя поделка для дополнения #include директив
Класс! Сча запробую ее.
abbreviations «#d», «#i», «#p»
Есть же snipmate.
сочетания для grep'ания слов по всем файлам C и C++ в текущей директории и ниже (может подняться на уровни выше до каталога с именем src)
Я сделал так:
map <F4> :execute «noa vim /» . expand(«<cword>») . «/gj **/*.h **/*.c*» <Bar> cw<CR> Раньше грепал только по файлам, у которых расширение текущего файла.
автоматическая перегенерация файлов тэгов, для этого есть специальные плагины, но меня и так полностью устраивает
С автоматикой у меня не срослось. Делаю это по хоткею, когда есть необходимость:
Судя по описанию, вложенные блоки поддерживаются - «Handles nesting of #ifdefs (and #if) as well», но «but does not handle #if defined()», а я привык писать #if defined().
Да, я имел в виду, что defined или сравнения меньше, больше не будут работать. С автором плагина обсуждали, решили, что если это и можно сделать, то только с большим трудом.
commentary - KISS плагин для комментирования/разкомментирования кода
Чем он лучше nerdcommenter?
В commentary только одна команда и та настраиваемая. Всё что может - либо раскомментировать либо закомментировать блок (т.е. toggling). Но этого достаточно. И сама команда принимает text-object или motion, так что если использовать мэпинг «gc», то будут работать gci{, gj, g3j и т.д. Т.е. это плагин Tim Pope в его же стиле, с очень хорошой интеграцией со встроенными возможностями Vim.
Есть же snipmate.
Использую ultisnips, к snipmate у меня какие-то претензии были, но я их уже забыл ). Да и для таких простых вещей, где нету ни одного placeholder, использование сниппетов мне кажется излишним.
С автоматикой у меня не срослось. Делаю это по хоткею, когда есть необходимость:
У меня тоже были по началу проблемы с автообновлением, потом как-то разрешилось и я уже очень давно не вспоминаю о tags файлах. Просто создаю пустой tags файл в корне проекта и всё, дальше при каждом сохранении он автоматом обновляется в фоне. Удобно, и считаю время потраченное на тот десяток другой строк кода на VimL окупилось сполна.
С какими настройками? Надо учитывать, что через libclang работает значительно быстрее чем если использовать исполняемый файл clang. Хотя на чём-то вроде boost или Qt libclang тоже будет тормозить.
" Add highlighting for function definition in C++
function! EnhanceCppSyntax()
syn match cCustomParen "(" contains=cParen contains=cCppParen
syn match cCustomFunc "\w\+\s*(" contains=cCustomParen
syn match cppCustomScope "::"
syn match cppCustomClass "\w\+\s*::" contains=cCustomScope
hi def link cCustomFunc Function
endfunction
autocmd Syntax cpp call EnhanceCppSyntax()
Расширение подсветки на функции. Еще использую GNU Global для индексации - работает довольно хорошо и шустро, единственно плагин к vim глючит.
Написал еще пару функций под наш проект с переключением между хедером и сырцом, поиском файлов, шаблоннами заголовков - это проще чем пользоваться сторонними плагинами
Т.е. только один этот файл был скачан? Так будет работать только без использования libclang, без сниппетов и без автоматического поиска системных заголовочных файлов.
Лучше клонировать master с GitHub, на vim.org сильно устаревшая версия. Может понадобится установить:
let g:clang_auto_user_options = 'path, .clang_complete, clang'
Если всё же хочется оставить как есть, можно создать файл .clang_complete рядом с исходниками, в котором прописать аргументы для компилятора (по одному на строчке), -I/usr/include и подобное. В документации есть пример. Список системных инклюдов для плюсов можно посмотреть например так:
В commentary только одна команда и та настраиваемая. Всё что может - либо раскомментировать либо закомментировать блок (т.е. toggling).
Ну вообще да, в 99% случаев только этим функционалом я пользуюсь в nerdcommenter. А вложенные и многосторочные комментарии он умеет? Умеет ли он комментировать что-либо кроме c/c++?
Просто создаю пустой tags файл в корне проекта и всё, дальше при каждом сохранении он автоматом обновляется в фоне.
А, то бишь хук на запись. В данном случае это практически тот же хоткей :)
function! EnhanceCppSyntax()
syn match cppFuncDef "::\~\?\zs\h\w*\ze([^)]*\()\s*\(const\)\?\)\?$"
hi def link cppFuncDef Special
endfunction
но ваш, похоже, работает лучше.
Написал еще пару функций под наш проект с переключением между хедером и сырцом, поиском файлов, шаблоннами заголовков - это проще чем пользоваться сторонними плагинами
Тупо не работает. Создает cpp-файл, но пустой. Как я не пытался его настроить, ничего не вышло. Пробовали с автором решить проблему, но так и не удалось. Да я уже привык делать все, что мне нужно быстро и без protodef.
Ну вообще да, в 99% случаев только этим функционалом я пользуюсь в nerdcommenter. А вложенные и многосторочные комментарии он умеет? Умеет ли он комментировать что-либо кроме c/c++?
Да на оба вопроса. Причем всегда используются многострочные комментарии, если язык их поддерживает (вроде можно как-то изменить). Он в каждую строку добавляет в начале и в конце символы комментария (т.е. /* и */ для C/C++). Способ комментирования он узнает из опций 'comments' и 'commentsstring', так что если они устанавливаются в файле синтаксиса, то commentary будет работать с этим типом файлов.
А, то бишь хук на запись. В данном случае это практически тот же хоткей :)
Почти, просто так как у меня многолетняя привычка вводить :w когда я приостанавливаю набор кода, этот неявный хоткей я не замечаю.
Хм… Я пользуюсь protodef'ом так: захожу в файл реализации, нажимаю <leader>PP и получаю болванку для реализации. Так он работает. Нужен он исключительно для того чтобы не писать самому конструкторы и виртуальные деструкторы, которые ничего не делают, а также не терять у методов const-квалификатор. А как же он у тебя не работает? Я его немножко правлю под C++11, могу и твою проблему глянуть.
Так я тоже могу. У меня используется listchars если spacehi не найден. Но подсветка плохих space'ов бросается в глаза сильнее чем замена их на спецсимволы.
А вот автоматическое их истребление — плохая идея. Не секрет, что во многих проектах с такими вещами бардак, но выяснение отношений с автором проекта на эту тему не самый разумный способ добиться принятия твоего патча.
Так я тоже могу. У меня используется listchars если spacehi не найден. Но подсветка плохих space'ов бросается в глаза сильнее чем замена их на спецсимволы.
Ну хз, нужно будет попробовать.
А вот автоматическое их истребление — плохая идея. Не секрет, что во многих проектах с такими вещами бардак, но выяснение отношений с автором проекта на эту тему не самый разумный способ добиться принятия твоего патча.
В моем случае это не проблема, поскольку я сам решаю, какой стиль кода должен использоваться в проекте.
let g:protodefprotogetter = $VIM.'/bundle/protodef/pullproto.pl'
Вот такая конструкция разбиралась не правильно. Если поправить ее на
let g:protodefprotogetter = $HOME.'/.vim/bundle/protodef/pullproto.pl'
то плагин работает. Хотя работает он странно.
Для некоторых (но не всех) методов, возвращающих void, он добавляет return /* something */; для некоторых методов, возвращающих bool, он не добавляет return вообще.
Если курсор стоит внутри метода, то по хоткею новый метод добавится внутрь метода, где стоит курсор.