====== 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