Объяснение синтаксиса foldexpr

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

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

что неясно?

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

Спасибо

Ответы

Ответ 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.