Исходя из предложений Джерома и Омара, я придумал это (для моего vimrc), чтобы автоматически и однозначно свернуть мои файлы DokuWiki (в которых заголовок верхнего уровня помечен ====== в начале строки, вплоть дозаголовок четвертого уровня, помеченный ===):
function! DWTitleLevel()
let j = len(matchstr(getline(v:lnum), '^=\+'))
if j =~ 6 | return ">1"
elseif j =~ 5 | return ">2"
elseif j =~ 4 | return ">3"
elseif j =~ 3 | return ">4"
endif
endfunction
'^ = +' означает совпадение с начала строки любого числа непрерывных '=' s
Тогда это вvim modeline хорошо работает для файла DokuWiki:
foldmethod=expr foldexpr=DWTitleLevel() foldcolumn=5
А для Markdown мне нужно было написать код Омара так:
if empty(j) | return "=" | else | return ">".len(j) | endif