当使用D时,Vim to fold unittests中的fold表达式是什么?

当使用D时,Vim to fold unittests中的fold表达式是什么?,vim,editor,d,folding,Vim,Editor,D,Folding,我最近经常使用D,并使用Vim作为编辑器。我处理的代码有很多内联单元测试,我想把它们折叠起来,这样我就只能看到代码了。Vim中的折叠表达式需要是什么才能自动折叠这些单元测试 下面是一个示例,说明它们在D代码中的外观: T getUnixTime(T, A...)(A args) { return to!T(SysTime(DateTime(args)).toUnixTime()); } unittest { assert(getUnixTime!string(2013, 7,

我最近经常使用D,并使用Vim作为编辑器。我处理的代码有很多内联单元测试,我想把它们折叠起来,这样我就只能看到代码了。Vim中的折叠表达式需要是什么才能自动折叠这些单元测试

下面是一个示例,说明它们在D代码中的外观:

T getUnixTime(T, A...)(A args)
{
    return to!T(SysTime(DateTime(args)).toUnixTime());
}

unittest
{
    assert(getUnixTime!string(2013, 7, 18, 14, 49, 43) == "1374155383");
    assert(getUnixTime!uint(2071, 12, 5, 12, 9, 5) == 3216542945);
}
我希望这个看起来像:

T getUnixTime(T, A...)(A args)
{
    return to!T(SysTime(DateTime(args)).toUnixTime());
}

+--  5 lines: unittest----------------------------------------------------------
您是在寻找“折叠显示”还是“折叠命令”

假设光标位于
unittest
,则可以执行以下操作

zf/{/e
创建一个折叠


让它成为更快的映射。

很抱歉回复太晚。我一直在寻找相同的功能,最终得出了以下结论:

set foldexpr=DlangUnitTestFold(v:lnum)

" If the line matches `unittest {`, increase the indentation.
" Keep the indentation level steady until we encounter a line
" that only matches `}`: if so, decrease the indentation.

function! DlangUnitTestFold(lnum)
  if getline(a:lnum) =~ '^\s*unittest\s{\s*$'
    return "a1"
  elseif getline(a:lnum) =~ '^\s*}\s*$'
    return "s1"
  else
    return "="
  endif
endfunction
不确定这是否太老套,但对我来说很有效:)

编辑:理想情况下,您应该将第一行放在setlocal中,例如:

au BufNewFile,BufRead *.d setlocal foldexpr=DlangUnitTestFold(v:lnum)

没有一个我完全不知道从哪里开始!因此,我在一个程序员问答网站上寻求帮助。你知道吗?我只是听说Stackoverflow有点不赞成“给我发代码”式的问题。我帮不了你,但是在中有一个关于折叠表达式的深入教程,以及关于这个主题的很多更多提示。我假设是一个折叠表达式。以下是我主要用作模型行的内容,但它不适合OP的用途
vim:fdc=3:fdm=expr:fde=getline(v \:lnum)=~'\unittest'?'>1'\:'1'
。请告诉我们是如何完成的:)。