- Only issue 'zo' if there is any fold at all.
- Correct possible bug, code was using 'start_lnum' var, but it
was changed/incremented which could lead to wrong results.
- Use bang with norm, to prevent user re-mapping interfere with
standard ones.
During TOC update, screen sometimes scrolls -- most often I've seen this
when I'm working inside large enough fold (does not fit in one screen).
Fix uses winsaveview()/winrestview() instead of getpos()/setpos().
Winview pair would also manage scroll position on screen, not just
cursor position in text.
Since TOC is completely recreated, Vim loses its fold open/close status.
If your TOC was open, after you save it gets closed.
Fix will save fold status, and restore it after TOC is updated.
getpos()/setpos() combination does not account for changes of lines
count. So if you do getpos, then remove lines _above_ it, then do
setpos -- it's going to be off.
The fix calculates the "diff", and adjusts saved position for that diff
(if any).
If section title contains multibyte chars, the fold shortening function
often fails, because it works with text as array of bytes, not
characters (see strlen() doc for example).
This commit fixes this issue.