Wiele metod składania w vimie

9

Często korzystam z opcji składania vima i zwykle ustawiam foldmethod na składnię. Niedawno odkryłem, że można dodawać niestandardowe fałdy, dzięki czemu mogę wstawiać całe bloki /*{{{*/i /*}}}*/co jest bardzo przydatne do grupowania dużych sekcji pliku źródłowego. Jednak, aby użyć tej funkcji, muszę ustawić metodę fold na marker, a ja tracę składanie składni.

Czy w vimie można mieć jednocześnie dwie aktywne metody składania? set foldmethod=syntax,markernie działa.

Bjarke Freund-Hansen
źródło

Odpowiedzi:

4

Nie, ściśle mówiąc, nie jest możliwe, aby w Vimie było aktywnych wiele metod składania jednocześnie.

Możesz emulować składanie znaczników, jeśli chcesz nauczyć się pisać reguły podświetlania składni i zhakować plik wyróżnień dla języka, do którego chcesz dodać emulację składania znaczników. Ma to kilka wad:

  1. Polecenia tworzenia / usuwania składania („zf”, „zd” itd.), Które działają z markerem i ręcznymi metodami składania, nie będą działać, gdy metoda składania jest ustawiona na „składnia”.

  2. Problemem jest emulowanie markerów, które „wymuszają” poziom składania (np. „ {{{1” / „ }}}1”) W przeciwieństwie do zwiększania / zmniejszania poziomu składania o jeden (np. „ {{{” / „ }}}”); albo musisz całkowicie zignorować liczby poziomów składania lub zaryzykować, że będziesz ingerować - i być może złamiesz - resztę reguł składania opartych na składni.

Sugeruję, że gdy okaże się, że potrzebujesz składania na podstawie markera, zastosujesz tę metodę całkowicie. Może to zająć trochę czasu i wysiłku, ale jeśli naprawdę potrzebujesz elastyczności, może być tego warte, zwłaszcza biorąc pod uwagę trudności z połączeniem tych dwóch elementów.

Heptyt
źródło
2

Szukałem tego samego. Ponieważ nie chcę zhakować pliku składni, zamiast tego mam mapowanie, aby przełączać się między metodami fold. W tej chwili przełączam się tylko między składnią a znacznikiem:

nmap <Leader>ff :call <SID>ToggleFold()<CR>
function! s:ToggleFold()
    if &foldmethod == 'marker'
        let &l:foldmethod = 'syntax'
    else
        let &l:foldmethod = 'marker'
    endif
    echo 'foldmethod is now ' . &l:foldmethod
endfunction
idbrii
źródło