Ваша догадка об использовании метода expr
, я полагаю, была правильной!
Вы можете использовать синтаксическую структуру файла для проверки собственного свертывания в стиле syntax
.Следующее в моем .vimrc
произвело ожидаемое поведение:
function! RubyMethodFold(line)
let line_is_method_or_end = synIDattr(synID(a:line,1,0), 'name') == 'rubyMethodBlock'
let line_is_def = getline(a:line) =~ '\s*def '
return line_is_method_or_end || line_is_def
endfunction
set foldexpr=RubyMethodFold(v:lnum)
Некоторые предостережения:
Я не уверен, должен ли окончательный аргумент synID
быть 0
или 1
.Это аргумент, который определяет, получите ли вы информацию о синтаксисе для самого верхнего прозрачного или непрозрачного элемента в указанном местоположении.Когда нет прозрачного элемента, аргумент не действует.В тривиальном примере, который я пробовал, это не вызывало никаких проблем, но могло бы.
Стоит также отметить, что регулярное выражение line_is_def
, вероятно, слишком мягкое.В этой ситуации может быть лучше вернуть -1
, поэтому строка, соответствующая регулярному выражению, сворачивается только тогда, когда она находится рядом с блоком свернутых методов.Также может сработать более ограничительное регулярное выражение.
Если вы чувствуете себя странно, вы можете расширить это и вернуть отдельные уровни сгиба для элементов rubyClass
и rubyModule
.
Если вырешите пойти по этому пути, в моем .vimrc есть несколько полезных пользовательских функций для интроспекции элементов синтаксиса и подсветки.Они наиболее удобны, когда сопоставлены с клавишами для быстрого использования, например:
nnoremap g<C-h> :echo GetSynInfo()<CR>
Пожалуйста, дайте мне знать, если это сработает для вас!Это было весело, чтобы выяснить.Кроме того, несмотря на то, что :help 'foldexpr'
не содержит много деталей, :help 'fold-expr'
гораздо полезнее и даже содержит несколько примеров в верхней части.