6

C ++テンプレートをうまくインデントするvimプラグイン/マクロ/関数を持っているか知っている人はいますか?

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

2 に答える 2

4

私の解決策:

" 名前空間とテンプレートをインデントしないでください
関数!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)
    終末
    let l:retv = cindent('.')
    let l:pindent = indent(l:pline_num)
    if l:pline =~# '^\s*テンプレート\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.*'
        l:retv = 0 にする
    終了
    return l:retv
終了機能

if has("autocmd")
    autocmd BufEnter *.{cc,cxx,cpp,h,hh,hpp,hxx} setlocal indentexpr=CppNoNamespaceAndTemplateIndent()
終了
于 2010-06-11T08:04:20.830 に答える
2

identexprオプションを使用して、を評価することでインデントを指定できます(つまり、vim スクリプト関数を記述します)。この関数は、文字列 (行) を受け取り、インデントするスペースの数を返す必要があります。これにより、このテンプレート条件のインデント レベルを返すか、通常の C のような状況で autoindent 、 smartindent または cindent にフォールバックする柔軟性が得られます。

これは、Qt のシグナルとスロット拡張を処理するために作成された例です。これは、cindent 関数へのフォールバックを示しています。

于 2008-12-23T03:08:55.010 に答える