Кто-нибудь знает или знает о плагине / макросе / функции vim, которая красиво отступает от шаблонов C++?
Когда я выделяю определение шаблона в файле vim .hpp / .h и делаю отступ с помощью '=', я получаю что-то вроде этого:
> template <
> class TFilter,
> class TParser,
> class TConsumer,
> class TDataProcessor,
> class TDataFeed,
> class TSymbolMap
> >
> struct DataFeedTraits
> {
> typedef TFilter Filter;
> typedef TParser<TSymbolMap> Parser;
> typedef TConsumer<Parser> Consumer;
> typedef TDataProcessor<Filter,Consumer> DataProcessor;
> typedef TDataFeed<Filter,DataProcessor,Parser,Ccnsumer> DataFeed;
> };
Я думаю, что cindent выравнивает объявление структуры / класса с закрывающей скобкой '>'. Я хотел бы получить что-то подобное или подобное, точное форматирование не имеет значения, насколько оно отформатировано:
template <
class TFilter,
class TParser,
class TConsumer,
class TDataProcessor,
class TDataFeed,
class TSymbolMap
>
struct DataFeedTraits
{
typedef TFilter Filter;
typedef TParser<TSymbolMap> Parser;
typedef TConsumer<Parser> Consumer;
typedef TDataProcessor<Filter,Consumer> DataProcessor;
typedef TDataFeed<Filter,DataProcessor,Parser,Ccnsumer> DataFeed;
};





Вы можете использовать параметр Identexpr, чтобы указать отступ, оценив выражение (т. Е. Написав функцию сценария vim). Эта функция должна принимать строку - строку - и возвращать количество пробелов для отступа. Это дает вам гибкость для возврата уровня отступа для этого условия шаблона или возврата к автоиндент, умный индент или cindent в обычных ситуациях, подобных C.
Вот пример, который был создан для обработки сигналов и расширений слотов Qt. Демонстрирует возврат к функции cindent.
Мое решение:
" Don't indent namespace and template
function! CppNoNamespaceAndTemplateIndent()
let l:cline_num = line('.')
let l:cline = getline(l:cline_num)
let l:pline_num = prevnonblank(l:cline_num - 1)
let l:pline = getline(l:pline_num)
while l:pline =~# '\(^\s*{\s*\|^\s*//\|^\s*/\*\|\*/\s*$\)'
let l:pline_num = prevnonblank(l:pline_num - 1)
let l:pline = getline(l:pline_num)
endwhile
let l:retv = cindent('.')
let l:pindent = indent(l:pline_num)
if l:pline =~# '^\s*template\s*\s*$'
let l:retv = l:pindent
elseif l:pline =~# '\s*typename\s*.*,\s*$'
let l:retv = l:pindent
elseif l:cline =~# '^\s*>\s*$'
let l:retv = l:pindent - &shiftwidth
elseif l:pline =~# '\s*typename\s*.*>\s*$'
let l:retv = l:pindent - &shiftwidth
elseif l:pline =~# '^\s*namespace.*'
let l:retv = 0
endif
return l:retv
endfunction
if has("autocmd")
autocmd BufEnter *.{cc,cxx,cpp,h,hh,hpp,hxx} setlocal indentexpr=CppNoNamespaceAndTemplateIndent()
endif