[英]Vim indentation for c++ templates?
有没有人知道或者知道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;
};
我的解决方案
" 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
您可以使用identexpr选项通过计算表达式来指定缩进(即编写vim脚本函数)。 此函数应接受字符串 - 行 - 并返回要缩进的空格数。 这使您可以灵活地返回此模板条件的缩进级别,或者在正常的类似C的情况下回退到autoindent , smartindent或cindent 。
以下是为处理Qt的信号和插槽扩展而创建的示例。 它展示了对cindent函数的回落。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.