Tim Chase wrote:
> For a more complex version, you could use
> 
> fde=(getline(v:lnum)=~'^Index')?0:(getline(v:lnum)=~'^=\\{3,}')?1:((getline(v:lnum)=~'^@@')?'>2':'=')
> 
> (all in one line, in case mailers mung it) which should handle 
> both multiple hunks and multiple files-to-be-patched in the same 
> .diff/.patch file.
> 
> That breaks down as
> 
> - If it begins with 'Index', don't indent it
> 
> - If it begins with 3+ "=" signs, start indenting 1 level
> 
> - If it starts with "@@", consider it the beginning of a hunk and 
> start indent-level-2
> 
> - Finally, for everything else, treat it as the indentation that 
> comes from the previous line.

Thank you for your input. I used it as inspiration for the attached 'diff'
ftplugin, which handles the fold level of various diff formats (normal, context,
unified, subversion, git, rcs, ed).

-- 
Andreas.

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

setlocal fdm=expr
setlocal fde=DiffFoldLevel()
setlocal fdc=1

" Get fold level for diff mode
" Works with normal, context, unified, rcs, ed, subversion and git diffs.
" For rcs diffs, folds only files (rcs has no hunks in the common sense) 
" fdl=1 ==> file
" fld=2 ==> hunk
" context diffs need special treatment, as hunks are defined
" via context (after '***************'); checking for '*** '
" or ('--- ') only does not work, as the file lines have the 
" same marker.
" Inspired by Tim Chase.
function! DiffFoldLevel()
        let l:line=getline(v:lnum)
        
        if l:line =~# '^\(diff\|Index\)'                " file
                return '>1'
        elseif l:line =~# '^\(@@\|\d\)'                 " hunk
                return '>2'
        elseif l:line =~# '^\*\*\* \d\+,\d\+ \*\*\*\*$' " context: file1
                return '>2'
        elseif l:line =~# '^--- \d\+,\d\+ ----$'                " context: file2
                return '>2'
        else
                return '='
        endif
endfunction

Reply via email to