Я прочитал страницу справки о fold-expr ( :h fold-expr
), но он не объяснил, какой синтаксис используется в выражении.
Там было четыре примера:
:set foldexpr=getline(v:lnum)[0]==\"\\t\"
:set foldexpr=MyFoldLevel(v:lnum)
:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
:set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1
Я понял, что v:lnum
это строка, которая требует уровня отступа, и что выражение два - это вызов функции.
как насчет выражений 1,3 и 4? Может кто-нибудь, пожалуйста, объясните мне их?
Ответы:
От
:help 'foldexpr'
:foldexpr
Оценивается, поэтому она должна быть VIML код; нет никакого упоминания о «специальном синтаксисе» или тому подобном. Результат этой оценки контролирует то, что Vim считает фолдом или нет.Возможные значения
Это не полный список; только те, которые используются в примерах в вашем вопросе. Смотрите
:help foldexpr
полный список.Первый
Первый довольно прост, когда мы добавляем несколько пробелов и удаляем обратную косую черту, нам нужно, чтобы это работало в
:set
команде:getline(v:lnum)
получает всю линию.[0]
получает первый персонаж этого== "\t"
проверяет, является ли это символом табуляции.Если бы вы расширили это, чтобы подсчитать количество вкладок, у вас будет сворачивание на основе отступов (по крайней мере, когда
expandtab
не включено).В третьих
Третий действительно не намного сложнее, чем первый; как и в первом примере, мы сначала хотим сделать его более читабельным:
getline(v:lnum)
=~
to'^\s*$'
;^
привязки к началу,\s
означает любой символ пробела,*
означает повторение предыдущего нуля или более раз и$
привязку к концу. Таким образом, это регулярное выражение соответствует (возвращает true) для пустых строк или строк только с пробелами .getline(v:lnum + 1)
получает следующую строку.\S
, что соответствует любому непробельному символу в любом месте этой строки.<1
иначе1
. Это делается с «тройным» ,if
известной из C и некоторых других языках:condition ? return_if_true : return_if_false
.<1
означает сгиб заканчивается на этой линии, а1
означает сгиб один.Итак, если мы завершим сгиб, если строка пуста, а следующая строка не пуста. В противном случае мы находимся на уровне 1. Или, как
:h foldexpr
говорится:четвертый
Четвертый ведет себя так же, как третий, но делает это немного по-другому. Расширено, это:
Если предыдущая строка является пустой строкой, а текущая строка является непустой строкой, мы начинаем сгиб на этой строке (
>1
), если нет, мы устанавливаем уровень сгиба равным 1.Послесловие
Таким образом, логика на всех трех примерах действительно проста. Большая часть трудностей заключается в недостатке пробелов и использовании обратной косой черты.
Я подозреваю, что вызов функции имеет некоторые издержки, и, поскольку он оценивается для каждой строки, вы хотите иметь достойную производительность. Я не знаю, насколько велика разница на современных машинах, и рекомендую использовать функцию (как во втором примере), если у вас нет проблем с производительностью. Помните Кнута: «преждевременная оптимизация - корень всего зла» .
Этот вопрос также на StackOverflow , который имеет немного другой ответ. Но мой, конечно, лучше ;-)
источник
По сути, вы спрашиваете, каковы другие элементы в этих выражениях, что можно найти, вызвав
:help
любое из них по очереди:Я разбил эти выражения по частям ниже, чтобы проиллюстрировать их значение:
1 вернет 1 для всех строк, начинающихся с табуляции, и 0 для других строк:
3 Концы сгиба на пустых строках после абзацев:
4 Запускает сгибы на пустых строках, начиная с абзацев:
Значения
<1
,>1
и т.д., прямо под этими выражениями:help fold-expr
источник
Случайно разместил мой ответ как комментарий и отправил его рано. Чертовски мобильный.
Насколько я понимаю, выражение должно возвращать число, и это число будет использоваться для определения, на каком уровне будет сложена данная строка. 0 не сложен, 1 - самая внешняя складка, 2 - складка, вложенная в складку уровня 1, и так далее.
Выражения в примерах выглядят так, как будто они имеют значение true или false. VimScript не имеет правильного логического типа, поэтому в действительности это будет 1 или 0, которые являются допустимыми уровнями сгиба.
Вы можете написать свое собственное выражение, используя VimScript, который так же прост, как возврат 1 или 0, или более сложный, с учетом вложенных сгибов.
источник