Объяснение синтаксиса foldexpr - PullRequest
16 голосов
/ 12 мая 2011

Не могли бы вы объяснить мне синтаксис в следующем примере или опубликовать ссылку, где есть более общие подробные объяснения отдельных символов?Справка в vim неполная

:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1

что неясно?

  1. Строки находятся в одинарных кавычках, а не в двойных?Или я могу выбрать?
  2. Что означает знак объяснения (?)?в =~'\\S'?'<1':1
  3. Что означает выражение 'string1'string2'string3?
  4. Что означает :1?

Спасибо

1 Ответ

34 голосов
/ 12 мая 2011

Опция 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.

...