Folding
folding all lines except those matching pattern
" folding using /search/ pattern " \z " This folds every line that does not contain the search pattern. " see vimtip #282 and vimtip #108 map <silent><leader>z :set foldexpr=getline(v:lnum)!~@/ foldlevel=0 foldcolumn=0 foldmethod=expr<CR> " this folds all classes and function to create a code index. " mnemonic: think "function fold" map zff :/^\s*class\s\\|^\s*function\s\\|^\s*def\s/<CR>:set foldmethod=expr foldlevel=0 foldcolumn=1 foldtext=v:folddashes<CR><CR>
use space key to toggle fold under cursor
" space toggles the fold state under the cursor. nnoremap <silent><space> :exe 'silent! normal! za'.(foldlevel('.')?'':'l')<cr>
custom syntax folding example
The goal here is to make the file more readable by folding on logical items. The example file is an ics file from iCal, a calendar program. We want to create a fold on each event. We also want the fold to be descriptive about what the event is about, so we add the summary line contents to the fold text.
ics data from iCal program (partial data)
BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Apple Computer\, Inc//iCal 2.0//EN VERSION:2.0 BEGIN:VEVENT DTSTART;VALUE=DATE:20020527 DTEND;VALUE=DATE:20020528 SUMMARY:Memorial Day UID:C31860C8-1ED0-11D9-A5E0-000A958A3252 DTSTAMP:20041015T171054Z RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040530;BYMONTH=5;BYDAY=-1MO END:VEVENT BEGIN:VEVENT DTSTART;VALUE=DATE:20041225 DTEND;VALUE=DATE:20041226 SUMMARY:Christmas Day\n(fed holiday) UID:C318ADAA-1ED0-11D9-A5E0-000A958A3252 DTSTAMP:20041015T171054Z RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 END:VEVENT BEGIN:VEVENT DTSTART;VALUE=DATE:20020222 DTEND;VALUE=DATE:20020223 SUMMARY:Washington's Birthday UID:C318585A-1ED0-11D9-A5E0-000A958A3252 DTSTAMP:20041015T171054Z RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040221;BYMONTH=2 END:VEVENT BEGIN:VEVENT DTSTART;VALUE=DATE:20020704 DTEND;VALUE=DATE:20020705 SUMMARY:Independence Day UID:C31865E4-1ED0-11D9-A5E0-000A958A3252 DTSTAMP:20041015T171054Z RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040703;BYMONTH=7 END:VEVENT BEGIN:VEVENT DTSTART;VALUE=DATE:20040222 DTEND;VALUE=DATE:20040223 SUMMARY:Washington's Birthday (actual) UID:C3189C32-1ED0-11D9-A5E0-000A958A3252 DTSTAMP:20041015T171054Z RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2 END:VEVENT ...
fold at each event, adding the SUMMARY line content to the fold text
syn clear setl foldmethod=syntax syn region event start=/BEGIN:VEVENT/ end=/END:VEVENT$/ fold function! FoldText() let lines = getline(v:foldstart, v:foldend) let match = match(lines, 'SUMMARY:') let summary = '' if summary > -1 let summary = getline(v:foldstart + match) let summary = substitute(summary, 'SUMMARY:','','') endif return foldtext() . ' (' . summary . ')' endfunction setl foldtext=FoldText() setl fen