Czy istnieje sposób na użycie wielu metod składania vim jednocześnie?


14

Mam foldmethod=indentustawione w moim ~/.vimrc, iw ogóle, że pracuje dla mnie i chciałbym go zachować.

Jest jednak kilka plików, które regularnie edytuję (i które są pod moją wyłączną kontrolą), w których chciałbym dodać w systemie opartym na znacznikach, w szczególności, aby po otwarciu pliku duża sekcja rzadko patrzenie na (które jest już „ograniczone” przez wcięcie) jest wstępnie złożone. Wygląda na to foldmethod=markerpozwoli mi to zrobić (nie przeszkadza mi dziwne komentarz w pliku, aby wskazać te „wcześniej fałdy”, jeśli jest to konieczne), ale nadal chcę foldmethod=indentustawić tak, że można używać zc, zoi tak dalej, aby następnie składać lub rozkładać sekcje według wcięcia. O ile wiem, nie mogę ustawić metody fold na wiele wartości.

Czy istnieje inny sposób, aby to osiągnąć (najlepiej używając czegoś osadzonego w samym pliku)?


Staram się również, aby obie metody markera i wcięcia działały jednocześnie. Uważam również, że użycie wyrażenia fold jest najlepszą opcją. Czy znalazłeś wyrażenie pasujące zarówno do wcięcia, jak i znacznika?
Jp_3

1
@Jp_ nope, 'fraid not.
Andrew Ferrier,

Odpowiedzi:


10

Każde okno może mieć własną wartość lokalną 'foldmethod'; to, co ustawiłeś, ~/.vimrcto tylko globalne ustawienie domyślne. Istnieje wiele sposobów ustawienia innej wartości lokalnej dla określonego bufora :

  1. Ręcznie z :setlocal foldmethod=marker
  2. W przypadku określonego typu pliku (np. Pliki Java): :autocmd FileType java setlocal foldmethod=marker(lub in ~/.vim/after/ftplugin/java.vim)
  3. Dla określonych plików: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. Wewnątrz samego pliku poprzez modeline (ponieważ i tak musisz dodać znaczniki, wolałbym to):

/* vim: set fdm=manual : */

Nadal może być tylko jedna metoda składania w jednym oknie. Jeśli chcesz zastosować różne strategie, musisz wybrać bardziej elastyczną metodę (np. expr) I ponownie wdrożyć tam „inne” metody (np. Poprzez 'foldexpr'rozważenie wcięcia). Lub używasz dwóch podziałów okna dla tego samego bufora i ustawiasz różne metody składania dla każdego podziału.

Ponieważ to prawdopodobnie nie jest to, co chcesz usłyszeć, możesz :autocmd CursorMovedzhakować coś razem z narzędziem, które przełącza metodę składania na podstawie bieżącej linii:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

1
Dzięki. To mówi mi, że mogę ustawić metodę fold na znacznik w tym buforze. Ale to, czego szukam, to coś, co wciąż pozwala mi korzystać z metody wcięcia fold, a niektóre sekcje (które oddzielone wcięciem) są wstępnie złożone. Jeśli zrobić (4) powyżej zc, zoi tak dalej nie będzie dłużej działać zgodnie z przeznaczeniem w tym buforze. Wyjaśniłem moje pytanie.
Andrew Ferrier,

Twoje pytanie nie było jasne w tym aspekcie, dziękuję za wyjaśnienie. Poprawiłem swoją odpowiedź.
Ingo Karkat

Tak, przepraszam, jeśli nie było jasne. Foldexpr brzmi jak najlepsze podejście, ale także skomplikowane. Spróbuję jednak. +1 dla wskaźnika.
Andrew Ferrier

Dzięki jeszcze raz. Próbowałem napisać foldexpr i otworzyłem tutaj pokrewne Q, które mogą być interesujące: superuser.com/questions/560167/...
Andrew Ferrier

@IngoKarkat: W pierwszym akapicie poniżej linii napisałeś, że na bufor może być tylko jedna metoda składania . Uważam, że powinno to być na okno .
garyjohn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.