| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- " These are settings to make folding easier to use and look at:
- " - Indented folded lines to match origin line indentation.
- " - Statbox to right displays line count and fold level.
- "
- " Note that custom foldtext will only work for vim 7.3+.
- if has('folding')
- set foldtext=CustomFoldText()
- function! CustomFoldText(...)
- " At least vim 7.3
- " - Requirement for `strdisplaywidth` (If `strdisplaywidth` fails for
- " multi-byte chars, consider checking the `strlen` help).
- if v:version < 703
- return foldtext()
- endif
- " Common variables for all foldmethods.
- let lineCount = v:foldend - v:foldstart + 1
- let displayWidth = winwidth(0) - &foldcolumn
- if (&number || &relativenumber)
- let displayWidth -= &numberwidth
- endif
- let foldChar = '-'
- " Set fold fillchar.
- let &l:fillchars = substitute(&l:fillchars,',\?fold:.','','gi')
- execute 'setlocal fillchars+=fold:' . foldChar
- " Fold text for Diffs - centre-aligned statbox with a line count.
- if &foldmethod == 'diff'
- let statBox = printf('[ %s matching lines ]', lineCount)
- let filler = repeat(foldChar, (displayWidth - strchars(statBox)) / 2)
- return filler.statBox
- endif
- " Fold text for all other situations.
- " - Fold description is a max length of 1/3 of the current window width.
- " - Fold & comment markers are removed from the fold description.
- " Prepare fold indent, and if long enough, indicate folding with '+'.
- let foldIndicator = '+ '
- let indLen = strdisplaywidth(foldIndicator)
- if indent(v:foldstart) >= indLen
- let indent = repeat(' ', indent(v:foldstart) - indLen) . foldIndicator
- else
- let indent = repeat(' ', indent(v:foldstart))
- endif
- " Prepare the statbox.
- " - Fix statbox width at 18 chars.
- " - Count width by display cells instead of bytes (vim 7.4+).
- if v:version >= 704
- let countType = 'S'
- else
- let countType = 's'
- endif
- let statBox = '[ ' . printf('%14'.countType, lineCount.' lns, lv '.v:foldlevel) . ' ]'
- " Prepare fold description.
- " - Use function argument as fold description text if provided.
- let foldDesc = a:0 > 0 ? a:1 : getline(v:foldstart)
- " Remove any fold markers.
- let foldmarkers = split(&foldmarker, ',')
- let foldDesc = substitute(foldDesc, '\V' . foldmarkers[0] . '\%(\d\+\)\?\s\*', '', '')
- " Remove any surrounding whitespace.
- let foldDesc = substitute(foldDesc, '^\s*\(.\{-}\)\s*$', '\1', '')
- " Space the description away from the midfiller a bit.
- let foldDesc = foldDesc . ' '
- " Prepare filler lines.
- " - midFiller is the fill between the description and statbox, so its
- " length is the leftover space after all other elements.
- let endFiller = repeat(foldChar, 1)
- let midFillerLength = displayWidth - strdisplaywidth(indent.foldDesc.statBox.endFiller)
- let midFiller = repeat(foldChar, midFillerLength)
- return indent.foldDesc.midFiller.statBox.endFiller
- endfunction
- endif
|