Опция foldexpr
должна содержать выражение, которое оценивается в целое число или строку определенного формата, который задает уровень сворачивания строки, число которой хранится в глобальной переменной v:lnum
на момент оценки.
Давайте следовать логике этого foldexpr
примера сверху вниз.
getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
На верхнем уровне все выражение является троичным оператором A ? B : C
.Результатом оператора является значение выражения B
, если A
оценивается как ненулевое, и значение выражения C
в противном случае (см. :help expr1
).В этом случае B
- это строковый литерал '<1'
, а C
- это число 1
(значение '<1'
и 1
в качестве спецификаторов уровня сгиба см. :help fold-expr
).
Выражение A
состоит из двух условий, к которым присоединяется оператор &&
:
getline(v:lnum) =~ '^\\s*$' && getline(v:lnum+1) =~ '\\S'
Оба условия имеют одинаковую форму
getline(N) =~ S
Функция getline
возвращает содержимоестроки (в текущем буфере), на которую ссылается номер строки, переданный в качестве аргумента (см. :help getline
).Когда вычисляется foldexpr
, переменная v:lnum
содержит номер строки, для которой должен быть рассчитан уровень свертывания.
Оператор =~
проверяет, соответствует ли его левый операнд регулярному выражению, данному его правымстроковый операнд и возвращает логическое значение (см., в частности, :help expr4
в конце раздела expr4
).Таким образом, условие A
предназначено для проверки того, что v:lnum
-ая строка соответствует шаблону '^\\s*$'
, а строка рядом с v:lnum
-ой строкой соответствует шаблону '\\S'
.
Шаблоны регулярных выражений указываются в выражении в виде строковых литералов.Строковые литералы имеют две синтаксические формы и могут быть заключены в двойные или одинарные кавычки.Разница между этими формами заключается в том, что строка в двойных кавычках может содержать различные управляющие последовательности, которые начинаются с обратной косой черты.Эти последовательности позволяют задавать специальные символы, которые нельзя легко ввести иначе (например, двойная кавычка - она пишет \"
).Строки в одинарных кавычках, с другой стороны, не допускают такие последовательности с обратной косой чертой.(Полное описание строк в одинарных и двойных кавычках см. :help expr-string
и :help
literal-string
.)
Заметным следствием синтаксиса строк в двойных кавычках является то, что сам символ обратной косой черты должен быть экранирован (\\
).Вот почему строки в одинарных кавычках часто используются для указания регулярных выражений: нет необходимости экранировать постоянно требуемый символ обратной косой черты.Тем не менее, можно заметить, что обратная косая черта, тем не менее, избегается в этих схемах выше.Это связано с тем, что некоторые символы (включая обратную косую черту) имеют особое значение в командах Ex (включая, конечно, :set
).Когда вы нажимаете Введите , чтобы запустить команду
:set foldexpr=...
Vim сначала интерпретирует некоторые последовательности символов (см. :help
cmdline-special
).В частности, последовательность \\
обрабатывается как одна обратная косая черта.
Собрав все это вместе, выражение проверяет, содержит ли номер строки v:lnum
только пустые символы, в то время как строка рядом с ней (число * 1064)*) имеет любой непустой символ (см. :help pattern
, чтобы понять значение шаблонов).Если это так, выражение оценивается в строку '<1'
, в противном случае оно оценивается в число 1
.