I see erratic screen redraw (namely, curshor shown
past last line of file, or on wrong line (which is not line('.'))).
This vim 7.0.86 taken from svn today, including recent
fix to winrestcmd().
It happens after certain winrestview() when 'showcmd' is set.
This code works ok with 'noshowcmd'. (It took me a while to
track this down to 'showcmd' option specifically. The
context of this code is, I want to make "scrollfix" plugin which
locks cursor at Nth visual line, Nth line from top of screen).
To reproduce:
1. First, let's see how it works ok
vim -u NONE -c 'so x.vim' x.vim
press <Down> to end of file to see how it works ok.
G gg G gg " works ok
2. With 'showcmd', same code works very differently:
vim -u NONE -c 'so x.vim' x.vim
:set showcmd " this turns on the problem
:set nu ruler statusline= laststatus=2 " this to watch the
" line number mismatch
press <Down> repeatedly till eof
BUG1: notice cursor draw past eof
<Up>
BUG2: now notice the cursor is in line 25 but
':echo line(".")' shows line 26
ggG
BUG3: Now cursor is totally off-limits
Note that ':echo g:last' allows to see the dict
used in last winrestview() thanks to 'let g:last = dict'
line in x.vim.
Yakov
----------------------------- x.vim ----------------------------------
:let g:scroll_fix=5 " fix cursor fixed at fixed Nth visual line
:let so=0
aug scrollfix
au!
au CursorMoved * :call ScrollFix()
aug END
function! ScrollFix()
if g:scroll_fix==0 | return | endif
" keep cursor on fixed visual line of the window
let dict = winsaveview()
if dict['lnum'] <= g:scroll_fix | return | endif
if dict['lnum'] - dict['topline'] + 1 == g:scroll_fix | return | endif
let dict['topline'] = dict['lnum'] - g:scroll_fix + 1
let g:last = dict " for debugging
call winrestview(dict)
endfunction