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

2327
Andrew Ferrier

В 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------ 

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

8
Вы путаете `zr` с` zm`; последний _ уменьшает_ уровень фолд. Ingo Karkat 11 лет назад 1
@IngoKarkat, я прав. Извините за путаницу - я всегда нахожу эти комбинации клавиш нелогичными. Я исправил свой вопрос. Andrew Ferrier 11 лет назад 0
_ «Я всегда нахожу эти комбинации клавиш нелогичными.» _ Это должно означать `zm` = сложить больше (вычесть уровень сгиба) и` zr` = сложить меньше (добавить уровень сложения) wisbucky 9 лет назад 0

3 ответа на вопрос

8
Ingo Karkat

This finds the highest foldlevel in the current file:

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

To set this automatically, you can use an :autocmd:

:autocmd BufWinEnter * let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)')) 
Инго, отлично, это именно то, что я искал. Благодарю. Позор `foldlevelstart` не имеет такой опции. Andrew Ferrier 11 лет назад 1
Похоже, это не работает на Cygwin Vim. Мой `foldlevel` равен 0, а` foldlevelstart` равен -1, когда я запускаю файл с этими настройками. CMCDragonkai 7 лет назад 0
0
garyjohn

Instead of using zr, use zR, which will open all folds. Similarly, zM will close all folds.

Гэри, спасибо. Это близко, но не делает то, что я описываю. Я хотел бы команду, которая уменьшает уровень сворачивания только на один, но от максимального уровня сворачивания, относящегося к рассматриваемому файлу. Чтобы сделать это, мне нужно использовать zM, чтобы уменьшить уровень сгиба до 0, а затем несколько раз zr, чтобы раскрыть больше деталей. Я ищу одну комбинацию команд / клавиш. Andrew Ferrier 11 лет назад 0
Вы можете сделать `zR` (установить уровень фолда на самый высокий уровень), тогда будет работать` zm`. Это всего лишь один дополнительный шаг. wisbucky 9 лет назад 2
-1
HarshaNadimpalli

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

Это не тот вопрос, который я задал. Я хочу, чтобы складывание было включено. Andrew Ferrier 5 лет назад 0