Ответ 1
Параметр 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
как fold
спецификаторы уровня см. :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
-th one
соответствует шаблону '\\S'
.
Шаблоны регулярных выражений указываются в выражении как
строковые литералы. Строковые литералы имеют две синтаксические формы и могут быть
цитируется с использованием двойных или одинарных кавычек. Разница между этими
формы состоит в том, что строка с двойными кавычками может содержать различные элементы управления
последовательности, начинающиеся с обратной косой черты. Эти последовательности позволяют указать
специальные символы, которые не могут быть легко напечатаны иначе (двойная кавычка,
например, он пишет \"
). Одиночные кавычки, с другой стороны,
не допускайте таких обратных слешковых последовательностей. (Полное описание
одиночные и двойные кавычки см. :help expr-string
и :help
literal-string
.)
Заметным следствием синтаксиса с двойными кавычками является то, что
символ обратной косой черты должен быть экранирован (\\
). Вот почему один
цитируемые строки часто используются для указания регулярных выражений: существует
не нужно выходить из постоянно требуемого символа обратной косой черты. Можно заметить,
однако, что обратные косые черты, тем не менее, избегают
выше. Это связано с тем, что некоторые символы (включая обратную косую черту) имеют
особый смысл, когда в командах Ex (в том числе :set
, конечно). когда
вы нажмете Enter, чтобы запустить команду
:set foldexpr=...
Сначала Vim интерпретирует некоторые последовательности символов (см. :help
cmdline-special
). В частности, последовательность \\
рассматривается как
один обратный слэш.
Объединяя все вместе, выражение проверяет, является ли номер строки
v:lnum
содержит только пустые символы, а строка рядом с ним
(номер v:lnum+1
) имеет любой непустой символ (см. :help pattern
-
понять смысл шаблонов). Если это так, выражение оценивается как
строка '<1'
, в противном случае она будет равна числу 1
.