Невозможно иметь разные типы фолдметодов в одном буфере. Как Vim должен знать, что есть некоторые комментарии на том же уровне отступа, что и другой текст, который вы хотите рассматривать как имеющий другой (более высокий номер) уровень?
Я уверен, что вы можете достичь того, чего хотите, установив метод сгибания в 'expr'. Это наиболее гибкий способ делать сгибы в Vim, но он может быть сложным (и / или медленным) в зависимости от того, что вы хотите. Я думаю, что это будет работать довольно легко для вашего случая использования.
Во-первых, где-то в вашем vimrc или vimscripts вам нужно убедиться, что foldexpr определен для рассматриваемого типа файла.
set foldexpr=MyFoldLevel(v:lnum)
set foldmethod=expr
" and for last code example
let b:previous_level = 0
и затем вам нужно конкретизировать свою функцию foldexpr, чтобы она назначала уровни таким образом, чтобы получить желаемое поведение. Нечто подобное приведенному ниже коду может быть близко к работе в тех случаях, когда каждая строка комментария имеет префиксный символ (т. Е. Не в вашем случае), но я ожидаю, что для этого потребуются некоторые изменения. h: fold-expr
было бы хорошим местом для поиска помощи:
function! MyFoldLevel(linenum)
" assign levels based on spaces indented and tabstop of 4
let level = indent(a:linenum) / 4
if getline(a:linenum) =~ [put line-based comment prefix pattern here]
let level = 20
endif
endfunction
Необходимо изменить, чтобы назначить более высокий уровень для строк между маркерами начала и конца комментария так, как вы хотите:
function! MyFoldLevel(linenum)
let linetext = getline(a:linenum)
if linetext =~ [put line-based comment prefix pattern here]
let level = 20
elseif linetext =~ '^\s*/\*'
let level = 20
elseif linetext =~ '^\s*\*/'
let level = 21
else
if b:previous_level == 20
let level = 20
else
"assuming code is space-indented with tabstop of 4
let level = indent(a:linenum) / 4
endif
endif
let b:previous_level = level
return level
endfunction
Я не ожидаю, что написанные мной функции метода сгиба будут работать точно так же, как написанные. Но они указывают на то, что будет работать.
Обратите внимание, что использование уровня '20' для комментариев - это просто произвольный уровень, который позволяет их сворачивать, в то время как весь код с отступами (предположительно с более низким уровнем) может быть видимым. «21» для последней строки комментария просто отличает его от предыдущих строк комментариев, имеющих уровень 20, чтобы знать, что следующую строку следует рассматривать как обычную строку кода.
Кроме того, ключевые операции, такие как 'zc' и 'zo', не будут работать правильно в комментариях, когда они настроены на уровень намного выше, чем окружающий код. Хотелось бы использовать прямую команду, например :set foldlevel=21
, чтобы показать все строки комментариев.
Не красиво, и я ожидаю, что это может быть немного упрощено, но что-то вроде этого, я думаю, требуется для того, что вы хотите.
На самом деле, подумав немного об этом, я думаю, вы бы хотели, чтобы первая строка любых блоков комментариев была на одном уровне, как если бы это была строка без комментариев, только последующие строки комментариев в том же блоке должны быть более высокого уровня, чтобы они «свернули» в начальную строку комментария. В приведенном мною коде, если он работает или приближается к работе вообще, я думаю, что vim свернет все строк комментариев за предыдущей строкой без комментариев, что не то, что вы хотите, но я к сожалению, нет больше времени, чтобы посвятить этой маленькой загадке. , , Я проделывал этот вид пользовательского фолдинга довольно много раз и, как правило, всегда получаю немного проб и ошибок, чтобы получить именно то, что я хочу.