====== Folding ======
===== folding all lines except those matching pattern =====
* http://www.noah.org/wiki/Vim#Folding
" folding using /search/ pattern
" \z
" This folds every line that does not contain the search pattern.
" see vimtip #282 and vimtip #108
map z :set foldexpr=getline(v:lnum)!~@/ foldlevel=0 foldcolumn=0 foldmethod=expr
" 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/:set foldmethod=expr foldlevel=0 foldcolumn=1 foldtext=v:folddashes
===== use space key to toggle fold under cursor =====
" space toggles the fold state under the cursor.
nnoremap :exe 'silent! normal! za'.(foldlevel('.')?'':'l')
===== 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