Jak ustawić foldlevelstart w vimie, aby początkowo nic nie składał, nadal pozwalając zr natychmiast działać?

8

W vim, ja zazwyczaj ustawiony foldmethoddo indentwiększości typów plików. Ogólnie rzecz biorąc, lubię otwierać pliki przy otwartych wszystkich fałdach. Jednak warto zacząć od razu, zmaby zacząć zamykać foldery globalnie w pliku, jeden poziom na raz, pozwalając mi zobaczyć ogólną strukturę pliku bez przeszkadzania szczegółom.

Jedynym ogólnym rozwiązaniem, jakie znalazłem, jest ustawienie foldlevelstartbardzo wysokiej liczby, np. 99, aby mieć pewność, że wszystkie pliki (pamiętając, że różne pliki będą miały różne poziomy maksymalnego wcięcia) zaczną się całkowicie rozwinięte. Jednak musiałbym wtedy używać zmwielokrotnie, aby zmniejszyć foldleveldo maksymalnego poziomu zagięcia pliku, zwykle znacznie poniżej 99, co jest kłopotliwe i niepraktyczne. Mógłbym ustawić foldlevelręcznie za pomocą wiersza polecenia vim, ale nadal muszę znać maksymalne wcięcie w pliku.

Czy istnieje praktyczny sposób otwarcia pliku z foldlevelustawieniem dokładnie o jeden więcej niż maksymalny aktualny poziom wcięcia / złożenia w samym pliku?

Na przykład biorąc pod uwagę następujący plik:

a
  b
    c
      d1
      d2
    e
      f1
      f2

Pierwsze naciśnięcie klawisza zmpokazuje:

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

(Należy jednak pamiętać, że powinno to działać w ogólnym przypadku, w którym początkowe maksymalne wcięcie pliku może mieć dowolną wartość).

Andrew Ferrier
źródło
1
Mylisz się zrz zm; ten ostatni zmniejsza poziom składania.
Ingo Karkat,
@IngoKarkat, masz rację, ja jestem. Przepraszam za zamieszanie - zawsze uważam te kluczowe kombinacje za sprzeczne z intuicją. Naprawiłem moje pytanie.
Andrew Ferrier,
„Zawsze uważam te kluczowe kombinacje za sprzeczne z intuicją”. Powinno to oznaczać zm= fold więcej (odejmij poziom fold) i zr= fold mniej (dodaj poziom fold)
wisbucky

Odpowiedzi:

9

Znajduje najwyższy poziom folderu w bieżącym pliku:

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

Aby ustawić to automatycznie, możesz użyć :autocmd:

:autocmd BufWinEnter * let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))
Ingo Karkat
źródło
1
Ingo, idealnie, właśnie tego szukałem. Dzięki. Wstyd foldlevelstartnie ma takiej opcji.
Andrew Ferrier,
To nie wydaje się działać na Cygwin Vim. Moje foldlevelma wartość 0 i foldlevelstartwynosi -1 po uruchomieniu pliku z tymi ustawieniami.
CMCDragonkai
0

Zamiast używać zr, użyj zR, który otworzy wszystkie fałdy. Podobnie zMzamknie wszystkie fałdy.

garyjohn
źródło
Gary, dzięki. To blisko, ale nie robi tego, co opisuję. Chciałbym polecenia, które zmniejsza poziom składania tylko o jeden, ale od maksymalnego poziomu składania odpowiedniego dla danego pliku. Aby to zrobić, musiałbym użyć zM, aby obniżyć poziom składania do 0, a następnie kilkakrotnie zr, aby otworzyć więcej szczegółów. Szukam jednej kombinacji poleceń / klawiszy.
Andrew Ferrier,
2
Możesz to zrobić zR(ustawić najwyższy poziom na folderze), a następnie zmzadziała. To tylko jeden dodatkowy krok.
wisbucky
-1

Ta opcja set nofoldenablepozwala rozpocząć plik z otwartymi wszystkimi fałdami

HarshaNadimpalli
źródło
To nie jest pytanie, które zadałem. Chcę włączyć składanie.
Andrew Ferrier,