2013-07-24 8 views
2

Я недавно использовал D и использовал Vim в качестве редактора. Я имею дело с кодом, который содержит множество встроенных модульных тестов, и я хочу их свернуть, поэтому я могу видеть только код. Что было бы сгибать выражение в Vim, чтобы свернуть эти модульные тесты автоматически?Каким будет выражение fold в Vim, чтобы сбрасывать unittests при использовании D?

Вот пример того, что они выглядят как в коде 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---------------------------------------------------------- 
+0

Нет. Я не знаю, с чего начать! Поэтому я прошу о помощи на сайте Q & A программистов. У вас есть идея? –

+1

Просто я слышал, что вопросы типа «Отправить мне код» несколько нахмурились в Stackoverflow. Не могу вам помочь, но есть подробный учебник по складским выражениям в [LVtHW] (http://learnvimscriptthehardway.stevelosh.com/chapters/49.html) и многие, многие другие намеки в [других вопросах] (http://stackoverflow.com/search?q=[vim]+foldexpr) об этой теме. – glts

ответ

2

Вы ищете «foldexpression» или «команда сброса»?

Предположив курсор находится на unittest, вы можете сделать

zf/{/e 

создать складку.

Сделайте это картографией для большей скорости.

+0

Я бы предположил, что сгибание. Следующее - это то, что я в основном использую как модную линию, но неадекватно для цели OP 'vim: fdc = 3: fdm = expr: fde = getline (v \: lnum) = ~ '\ unittest'? '> 1' \: ' 1''. Пожалуйста, покажите нам, как это делается :). –

0

Извините за поздний ответ. Я искал ту же функциональность, и в конце концов пришел с этим:

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 

Не уверен, что, если все это слишком Hacky, но это работает для меня :)

Edit: В идеале, вы бы поместите первую строку в setlocal, например:

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