Как я могу установить foldlevelstart в vim, чтобы изначально просто ничего не складывать, все еще позволяя zr работать немедленно?


8

В Vim, я обычно устанавливается foldmethodв indentбольшинстве типов файлов. В общем, мне нравятся файлы, которые открываются со всеми открытыми сгибами. Тем не менее, полезно начать немедленно, используя, zmчтобы начать закрывать сгибы глобально по файлу, по одному уровню за раз, что позволяет мне видеть общую структуру файла, не мешая деталям.

Единственное общее решение, которое я нашел, - это установить foldlevelstartочень большое число, например 99, чтобы убедиться, что все файлы (с учетом того, что разные файлы будут иметь разные уровни максимального отступа) начинаются полностью развернутыми. Тем не менее, мне пришлось бы использовать zmнесколько раз, чтобы уменьшить foldlevelмаксимальный уровень сгиба файла, обычно намного меньше 99, что является громоздким и непрактичным. Я мог бы установить foldlevelвручную, используя командную строку vim, но мне все равно нужно знать максимальный отступ в файле.

Есть ли практический способ открыть файл с foldlevelустановленным ровно на один больше, чем максимальный текущий уровень отступа / сгиба в самом файле?

Например, предоставлен следующий файл:

a
  b
    c
      d1
      d2
    e
      f1
      f2

Первое нажатие клавиши zmпокажет это:

a
  b
    c
+--  2 lines: d1------
    e
+--  2 lines: f1------

(Обратите внимание, однако, что он должен работать для общего случая, когда начальный максимальный отступ файла может быть любым значением).


1
Вы путаете zrс zm; последний уменьшает уровень сгиба.
Инго Каркат

@IngoKarkat, я прав. Извините за путаницу - я всегда нахожу эти комбинации клавиш нелогичными. Я исправил свой вопрос.
Эндрю Ферье

«Я всегда нахожу эти комбинации клавиш нелогичными». Это должно означать zm= сбросить больше (вычесть уровень сгиба) и zr= сбросить меньше (добавить уровень сложения)
wisbucky

Ответы:


9

Это находит самый высокий уровень сгиба в текущем файле:

:let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))

Чтобы установить это автоматически, вы можете использовать :autocmd:

:autocmd BufWinEnter * let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))

1
Инго, отлично, это именно то, что я искал. Спасибо. У стыда foldlevelstartнет такой возможности.
Эндрю Ферье

Похоже, это не работает на Cygwin Vim. Мой foldlevel0 и foldlevelstart-1, когда я запускаю файл с этими настройками.
CMCDragonkai

0

Вместо использования zrиспользуйте zR, что откроет все складки. Точно так zMже закроются все складки.


Гэри, спасибо. Это близко, но не делает то, что я описываю. Я хотел бы команду, которая уменьшает уровень сворачивания только на один, но от максимального уровня сворачивания, соответствующего рассматриваемому файлу. Чтобы сделать это, мне нужно использовать zM, чтобы уменьшить уровень сгиба до 0, а затем несколько раз zr, чтобы раскрыть больше деталей. Я ищу одну комбинацию команд / клавиш.
Эндрю Ферье

2
Вы можете сделать zR(установить уровень фолда на высший уровень), тогда zmбудет работать. Это всего лишь один дополнительный шаг.
wisbucky

0

Опция set nofoldenableпозволяет начать файл с открытыми сгибами


Это не тот вопрос, который я задал. Я хочу, чтобы складывание было включено.
Эндрю Ферье
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.