Отступ Vim для шаблонов c ++? - PullRequest
       19

Отступ Vim для шаблонов c ++?

5 голосов
/ 23 декабря 2008

Кто-нибудь знает или знает о плагине / макросе / функции 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 выравнивает объявление struct / class с закрывающей скобкой '>'. Я хотел бы закончить с чем-то вроде этого, или подобным, точное форматирование не имеет значения, насколько оно отформатировано:

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;
};

Ответы [ 2 ]

4 голосов
/ 11 июня 2010

Мое решение:

" 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
1 голос
/ 23 декабря 2008

Вы можете использовать опцию identexpr , чтобы указать отступ, оценивая выражение (т.е. написание функции сценария vim). Эта функция должна принимать строку - строку - и возвращать количество пробелов для отступа. Это дает вам возможность вернуть уровень отступа для этого условия шаблона или вернуться к autoindent , smartindent или cindent в обычных ситуациях, подобных C .

Вот пример, который был создан для обработки расширения сигналов и слотов Qt. Он демонстрирует отступление от функции cindent.

...