Есть две проблемы. Вторая проблема, вероятно, FoldText, где вы на правильном пути. Добавление кода для разбора последующих строк на текст и для закрывающей скобки - лучший способ сделать это. Если вы беспокоитесь, что это замедлит ход событий, не надо. У меня есть функции FoldText, где я делаю далеко, гораздо больше, и это не влияет на вещи заметно. (Функция сгиба текста, вероятно, вызывается не так часто, как вы думаете; она поддерживается только для видимых строк.)
РЕДАКТИРОВАТЬ: сложить часть текста еще проще, чем это. Если вы поместите курсор на первую фигурную скобку подписи, то при выполнении normal! va{y
часть sig в скобках будет помещена в @ ". Затем просто получите предварительную фигурную скобку и добавьте к ней join(split((@","\n"))
.
Другой проблемой, основной проблемой, является правило складывания. Похоже, вы хотите, чтобы сгибы функций были в первой строке сигнатуры функции даже для многострочных сигнатур. Вы можете попробовать использовать метод foldexpression, чтобы приблизиться к тому, что вы хотите. Этот foldexpr будет работать, если каждая функция (и только функции) начинается с 'void' в крайнем левом столбце:
set foldexpr=getline(v:lnum+1)=~'^void'?'<0':'1'
Так как это нереально, вы можете определить некоторый шаблон, который будет соответствовать всем строкам, которые вы хотите, как складные линии, то есть первые строки функции определяют вместе с любыми другими блоками сгиба, которые вы хотите:
function! VimFoldLevel(line)
"check if this is the last line in a fold block
if getline(a:line + 1) =~ '[pattern that matches first fold lines]'
return '<0'
else
return '1'
endif
endfunction
Затем убедитесь, что для foldexpr установлено значение, равное вашему уровню: set foldexpr=VimFoldLevel(v:lnum)
А также установите свой метод сгибания на expr: set foldmethod=expr
Возможно, есть другие способы сделать это, но это тот, который приходит на ум. , , Если есть какой-то обычно используемый метод свертывания (например, синтаксис), который используется для c ++ и который имеет разные уровни свертывания, вам следует изменить его. Пример, который я дал, предлагает только 1 уровень сгибов, функция полностью сложена или полностью развернута.