12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223 |
- " Test for 'scroll', 'scrolloff', 'smoothscroll', etc.
- source check.vim
- source screendump.vim
- source mouse.vim
- func Test_reset_scroll()
- let scr = &l:scroll
- setlocal scroll=1
- setlocal scroll&
- call assert_equal(scr, &l:scroll)
- setlocal scroll=1
- setlocal scroll=0
- call assert_equal(scr, &l:scroll)
- try
- execute 'setlocal scroll=' . (winheight(0) + 1)
- " not reached
- call assert_false(1)
- catch
- call assert_exception('E49:')
- endtry
- split
- let scr = &l:scroll
- setlocal scroll=1
- setlocal scroll&
- call assert_equal(scr, &l:scroll)
- setlocal scroll=1
- setlocal scroll=0
- call assert_equal(scr, &l:scroll)
- quit!
- endfunc
- func Test_scolloff_even_line_count()
- new
- resize 6
- setlocal scrolloff=3
- call setline(1, range(20))
- normal 2j
- call assert_equal(1, getwininfo(win_getid())[0].topline)
- normal j
- call assert_equal(1, getwininfo(win_getid())[0].topline)
- normal j
- call assert_equal(2, getwininfo(win_getid())[0].topline)
- normal j
- call assert_equal(3, getwininfo(win_getid())[0].topline)
- bwipe!
- endfunc
- func Test_mouse_scroll_inactive_with_cursorbind()
- for scb in [0, 1]
- for so in [0, 1, 2]
- let msg = $'scb={scb} so={so}'
- new | only
- let w1 = win_getid()
- setlocal cursorbind
- let &l:scb = scb
- let &l:so = so
- call setline(1, range(101, 109))
- rightbelow vnew
- let w2 = win_getid()
- setlocal cursorbind
- let &l:scb = scb
- let &l:so = so
- call setline(1, range(101, 109))
- normal! $
- call assert_equal(3, col('.', w1), msg)
- call assert_equal(3, col('.', w2), msg)
- call Ntest_setmouse(1, 1)
- call feedkeys("\<ScrollWheelDown>", 'xt')
- call assert_equal(4, line('w0', w1), msg)
- call assert_equal(4 + so, line('.', w1), msg)
- call assert_equal(1, line('w0', w2), msg)
- call assert_equal(1, line('.', w2), msg)
- call feedkeys("\<ScrollWheelDown>", 'xt')
- call assert_equal(7, line('w0', w1), msg)
- call assert_equal(7 + so, line('.', w1), msg)
- call assert_equal(1, line('w0', w2), msg)
- call assert_equal(1, line('.', w2), msg)
- call feedkeys("\<ScrollWheelUp>", 'xt')
- call assert_equal(4, line('w0', w1), msg)
- call assert_equal(7 + so, line('.', w1), msg)
- call assert_equal(1, line('w0', w2), msg)
- call assert_equal(1, line('.', w2), msg)
- call feedkeys("\<ScrollWheelUp>", 'xt')
- call assert_equal(1, line('w0', w1), msg)
- call assert_equal(7 + so, line('.', w1), msg)
- call assert_equal(1, line('w0', w2), msg)
- call assert_equal(1, line('.', w2), msg)
- normal! 0
- call assert_equal(1, line('.', w1), msg)
- call assert_equal(1, col('.', w1), msg)
- call assert_equal(1, line('.', w2), msg)
- call assert_equal(1, col('.', w2), msg)
- bwipe!
- bwipe!
- endfor
- endfor
- endfunc
- func Test_CtrlE_CtrlY_stop_at_end()
- enew
- call setline(1, ['one', 'two'])
- set number
- exe "normal \<C-Y>"
- call assert_equal([" 1 one "], ScreenLines(1, 10))
- exe "normal \<C-E>\<C-E>\<C-E>"
- call assert_equal([" 2 two "], ScreenLines(1, 10))
- bwipe!
- set nonumber
- endfunc
- func Test_smoothscroll_CtrlE_CtrlY()
- CheckScreendump
- let lines =<< trim END
- vim9script
- setline(1, [
- 'line one',
- 'word '->repeat(20),
- 'line three',
- 'long word '->repeat(7),
- 'line',
- 'line',
- 'line',
- ])
- set smoothscroll
- :5
- END
- call writefile(lines, 'XSmoothScroll', 'D')
- let buf = RunVimInTerminal('-S XSmoothScroll', #{rows: 12, cols: 40})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_1', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_2', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_3', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_4', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_5', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_6', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_7', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_8', {})
- if has('folding')
- call term_sendkeys(buf, ":set foldmethod=indent\<CR>")
- " move the cursor so we can reuse the same dumps
- call term_sendkeys(buf, "5G")
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_1', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_2', {})
- call term_sendkeys(buf, "7G")
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_7', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_8', {})
- endif
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_multibyte()
- CheckScreendump
- let lines =<< trim END
- set scrolloff=0 smoothscroll
- call setline(1, [repeat('ϛ', 45), repeat('2', 36)])
- exe "normal G35l\<C-E>k"
- END
- call writefile(lines, 'XSmoothMultibyte', 'D')
- let buf = RunVimInTerminal('-S XSmoothMultibyte', #{rows: 6, cols: 40})
- call VerifyScreenDump(buf, 'Test_smoothscroll_multi_1', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_number()
- CheckScreendump
- let lines =<< trim END
- vim9script
- setline(1, [
- 'one ' .. 'word '->repeat(20),
- 'two ' .. 'long word '->repeat(7),
- 'line',
- 'line',
- 'line',
- ])
- set smoothscroll
- set splitkeep=topline
- set number cpo+=n
- :3
- def g:DoRel()
- set number relativenumber scrolloff=0
- :%del
- setline(1, [
- 'one',
- 'very long text '->repeat(12),
- 'three',
- ])
- exe "normal 2Gzt\<C-E>"
- enddef
- END
- call writefile(lines, 'XSmoothNumber', 'D')
- let buf = RunVimInTerminal('-S XSmoothNumber', #{rows: 12, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_number_1', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_number_2', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_number_3', {})
- call term_sendkeys(buf, ":set cpo-=n\<CR>")
- call VerifyScreenDump(buf, 'Test_smooth_number_4', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smooth_number_5', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smooth_number_6', {})
- call term_sendkeys(buf, ":botright split\<CR>gg")
- call VerifyScreenDump(buf, 'Test_smooth_number_7', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_number_8', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_number_9', {})
- call term_sendkeys(buf, ":close\<CR>")
- call term_sendkeys(buf, ":call DoRel()\<CR>")
- call VerifyScreenDump(buf, 'Test_smooth_number_10', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_list()
- CheckScreendump
- let lines =<< trim END
- vim9script
- set smoothscroll scrolloff=0
- set list
- setline(1, [
- 'one',
- 'very long text '->repeat(12),
- 'three',
- ])
- exe "normal 2Gzt\<C-E>"
- END
- call writefile(lines, 'XSmoothList', 'D')
- let buf = RunVimInTerminal('-S XSmoothList', #{rows: 8, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_list_1', {})
- call term_sendkeys(buf, ":set listchars+=precedes:#\<CR>")
- call VerifyScreenDump(buf, 'Test_smooth_list_2', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_diff_mode()
- CheckScreendump
- let lines =<< trim END
- vim9script
- var text = 'just some text here'
- setline(1, text)
- set smoothscroll
- diffthis
- new
- setline(1, text)
- set smoothscroll
- diffthis
- END
- call writefile(lines, 'XSmoothDiff', 'D')
- let buf = RunVimInTerminal('-S XSmoothDiff', #{rows: 8})
- call VerifyScreenDump(buf, 'Test_smooth_diff_1', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smooth_diff_1', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_diff_1', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_diff_change_line()
- CheckScreendump
- let lines =<< trim END
- set diffopt+=followwrap smoothscroll
- call setline(1, repeat(' abc', &columns))
- call setline(2, 'bar')
- call setline(3, repeat(' abc', &columns))
- vnew
- call setline(1, repeat(' abc', &columns))
- call setline(2, 'foo')
- call setline(3, 'bar')
- call setline(4, repeat(' abc', &columns))
- windo exe "normal! 2gg5\<C-E>"
- windo diffthis
- END
- call writefile(lines, 'XSmoothDiffChangeLine', 'D')
- let buf = RunVimInTerminal('-S XSmoothDiffChangeLine', #{rows: 20, columns: 55})
- call VerifyScreenDump(buf, 'Test_smooth_diff_change_line_1', {})
- call term_sendkeys(buf, "Abar")
- call VerifyScreenDump(buf, 'Test_smooth_diff_change_line_2', {})
- call term_sendkeys(buf, "\<Esc>")
- call VerifyScreenDump(buf, 'Test_smooth_diff_change_line_3', {})
- call term_sendkeys(buf, "yyp")
- call VerifyScreenDump(buf, 'Test_smooth_diff_change_line_4', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_wrap_scrolloff_zero()
- CheckScreendump
- let lines =<< trim END
- vim9script
- setline(1, ['Line' .. (' with some text'->repeat(7))]->repeat(7))
- set smoothscroll scrolloff=0
- :3
- END
- call writefile(lines, 'XSmoothWrap', 'D')
- let buf = RunVimInTerminal('-S XSmoothWrap', #{rows: 8, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_wrap_1', {})
- " moving cursor down - whole bottom line shows
- call term_sendkeys(buf, "j")
- call VerifyScreenDump(buf, 'Test_smooth_wrap_2', {})
- call term_sendkeys(buf, "\<C-E>j")
- call VerifyScreenDump(buf, 'Test_smooth_wrap_3', {})
- call term_sendkeys(buf, "G")
- call VerifyScreenDump(buf, 'Test_smooth_wrap_4', {})
- call term_sendkeys(buf, "4\<C-Y>G")
- call VerifyScreenDump(buf, 'Test_smooth_wrap_4', {})
- " moving cursor up right after the <<< marker - no need to show whole line
- call term_sendkeys(buf, "2gj3l2k")
- call VerifyScreenDump(buf, 'Test_smooth_wrap_5', {})
- " moving cursor up where the <<< marker is - whole top line shows
- call term_sendkeys(buf, "2j02k")
- call VerifyScreenDump(buf, 'Test_smooth_wrap_6', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_wrap_long_line()
- CheckScreendump
- let lines =<< trim END
- vim9script
- setline(1, ['one', 'two', 'Line' .. (' with lots of text'->repeat(30)) .. ' end', 'four'])
- set smoothscroll scrolloff=0
- normal 3G10|zt
- END
- call writefile(lines, 'XSmoothWrap', 'D')
- let buf = RunVimInTerminal('-S XSmoothWrap', #{rows: 6, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_long_1', {})
- " scrolling up, cursor moves screen line down
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_long_2', {})
- call term_sendkeys(buf, "5\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_long_3', {})
- " scrolling down, cursor moves screen line up
- call term_sendkeys(buf, "5\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smooth_long_4', {})
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smooth_long_5', {})
- " 'scrolloff' set to 1, scrolling up, cursor moves screen line down
- call term_sendkeys(buf, ":set scrolloff=1\<CR>")
- call term_sendkeys(buf, "10|\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_long_6', {})
- " 'scrolloff' set to 1, scrolling down, cursor moves screen line up
- call term_sendkeys(buf, "\<C-E>")
- call term_sendkeys(buf, "gjgj")
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smooth_long_7', {})
- " 'scrolloff' set to 2, scrolling up, cursor moves screen line down
- call term_sendkeys(buf, ":set scrolloff=2\<CR>")
- call term_sendkeys(buf, "10|\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_long_8', {})
- " 'scrolloff' set to 2, scrolling down, cursor moves screen line up
- call term_sendkeys(buf, "\<C-E>")
- call term_sendkeys(buf, "gj")
- call term_sendkeys(buf, "\<C-Y>")
- call VerifyScreenDump(buf, 'Test_smooth_long_9', {})
- " 'scrolloff' set to 0, move cursor down one line.
- " Cursor should move properly, and since this is a really long line, it will
- " be put on top of the screen.
- call term_sendkeys(buf, ":set scrolloff=0\<CR>")
- call term_sendkeys(buf, "0j")
- call VerifyScreenDump(buf, 'Test_smooth_long_10', {})
- " Test zt/zz/zb that they work properly when a long line is above it
- call term_sendkeys(buf, "zt")
- call VerifyScreenDump(buf, 'Test_smooth_long_11', {})
- call term_sendkeys(buf, "zz")
- call VerifyScreenDump(buf, 'Test_smooth_long_12', {})
- call term_sendkeys(buf, "zb")
- call VerifyScreenDump(buf, 'Test_smooth_long_13', {})
- " Repeat the step and move the cursor down again.
- " This time, use a shorter long line that is barely long enough to span more
- " than one window. Note that the cursor is at the bottom this time because
- " Vim prefers to do so if we are scrolling a few lines only.
- call term_sendkeys(buf, ":call setline(1, ['one', 'two', 'Line' .. (' with lots of text'->repeat(10)) .. ' end', 'four'])\<CR>")
- " Currently visible lines were replaced, test that the lines and cursor
- " are correctly displayed.
- call VerifyScreenDump(buf, 'Test_smooth_long_14', {})
- call term_sendkeys(buf, "3Gzt")
- call term_sendkeys(buf, "j")
- call VerifyScreenDump(buf, 'Test_smooth_long_15', {})
- " Repeat the step but this time start it when the line is smooth-scrolled by
- " one line. This tests that the offset calculation is still correct and
- " still end up scrolling down to the next line with cursor at bottom of
- " screen.
- call term_sendkeys(buf, "3Gzt")
- call term_sendkeys(buf, "\<C-E>j")
- call VerifyScreenDump(buf, 'Test_smooth_long_16', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_one_long_line()
- CheckScreendump
- let lines =<< trim END
- vim9script
- setline(1, 'with lots of text '->repeat(7))
- set smoothscroll scrolloff=0
- END
- call writefile(lines, 'XSmoothOneLong', 'D')
- let buf = RunVimInTerminal('-S XSmoothOneLong', #{rows: 6, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_one_long_1', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_one_long_2', {})
- call term_sendkeys(buf, "0")
- call VerifyScreenDump(buf, 'Test_smooth_one_long_1', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_long_line_showbreak()
- CheckScreendump
- let lines =<< trim END
- vim9script
- # a line that spans four screen lines
- setline(1, 'with lots of text in one line '->repeat(6))
- set smoothscroll scrolloff=0 showbreak=+++\
- END
- call writefile(lines, 'XSmoothLongShowbreak', 'D')
- let buf = RunVimInTerminal('-S XSmoothLongShowbreak', #{rows: 6, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_long_showbreak_1', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_long_showbreak_2', {})
- call term_sendkeys(buf, "0")
- call VerifyScreenDump(buf, 'Test_smooth_long_showbreak_1', {})
- call StopVimInTerminal(buf)
- endfunc
- " Check that 'smoothscroll' marker is drawn over double-width char correctly.
- " Run with multiple encodings.
- func Test_smoothscroll_marker_over_double_width()
- " Run this in a separate Vim instance to avoid messing up.
- let after =<< trim [CODE]
- scriptencoding utf-8
- call setline(1, 'a'->repeat(&columns) .. '口'->repeat(10))
- setlocal smoothscroll
- redraw
- exe "norm \<C-E>"
- redraw
- " Check the chars one by one. Don't check the whole line concatenated.
- call assert_equal('<', screenstring(1, 1))
- call assert_equal('<', screenstring(1, 2))
- call assert_equal('<', screenstring(1, 3))
- call assert_equal(' ', screenstring(1, 4))
- call assert_equal('口', screenstring(1, 5))
- call assert_equal('口', screenstring(1, 7))
- call assert_equal('口', screenstring(1, 9))
- call assert_equal('口', screenstring(1, 11))
- call assert_equal('口', screenstring(1, 13))
- call assert_equal('口', screenstring(1, 15))
- call writefile(v:errors, 'Xresult')
- qall!
- [CODE]
- let encodings = ['utf-8', 'cp932', 'cp936', 'cp949', 'cp950']
- if !has('win32')
- let encodings += ['euc-jp']
- endif
- if has('nvim')
- let encodings = ['utf-8']
- endif
- for enc in encodings
- let msg = 'enc=' .. enc
- if RunVim([], after, $'--clean --cmd "set encoding={enc}"')
- call assert_equal([], readfile('Xresult'), msg)
- endif
- call delete('Xresult')
- endfor
- endfunc
- " Same as the test above, but check the text actually shown on screen.
- " Only run with UTF-8 encoding.
- func Test_smoothscroll_marker_over_double_width_dump()
- CheckScreendump
- let lines =<< trim END
- call setline(1, 'a'->repeat(&columns) .. '口'->repeat(10))
- setlocal smoothscroll
- END
- call writefile(lines, 'XSmoothMarkerOverDoubleWidth', 'D')
- let buf = RunVimInTerminal('-S XSmoothMarkerOverDoubleWidth', #{rows: 6, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_marker_over_double_width_1', {})
- call term_sendkeys(buf, "\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_marker_over_double_width_2', {})
- call StopVimInTerminal(buf)
- endfunc
- func s:check_col_calc(win_col, win_line, buf_col)
- call assert_equal(a:win_col, wincol())
- call assert_equal(a:win_line, winline())
- call assert_equal(a:buf_col, col('.'))
- endfunc
- " Test that if the current cursor is on a smooth scrolled line, we correctly
- " reposition it. Also check that we don't miscalculate the values by checking
- " the consistency between wincol() and col('.') as they are calculated
- " separately in code.
- func Test_smoothscroll_cursor_position()
- call NewWindow(10, 20)
- setl smoothscroll wrap
- call setline(1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
- call s:check_col_calc(1, 1, 1)
- exe "normal \<C-E>"
- " Move down another line to avoid blocking the <<< display
- call s:check_col_calc(1, 2, 41)
- exe "normal \<C-Y>"
- call s:check_col_calc(1, 3, 41)
- " Test "g0/g<Home>"
- exe "normal gg\<C-E>"
- norm $gkg0
- call s:check_col_calc(4, 1, 24)
- " Test moving the cursor behind the <<< display with 'virtualedit'
- set virtualedit=all
- exe "normal \<C-E>gkh"
- call s:check_col_calc(3, 2, 23)
- set virtualedit&
- normal gg3l
- exe "normal \<C-E>"
- " Move down only 1 line when we are out of the range of the <<< display
- call s:check_col_calc(4, 1, 24)
- exe "normal \<C-Y>"
- call s:check_col_calc(4, 2, 24)
- normal ggg$
- exe "normal \<C-E>"
- call s:check_col_calc(20, 1, 40)
- exe "normal \<C-Y>"
- call s:check_col_calc(20, 2, 40)
- normal gg
- " Test number, where we have indented lines
- setl number
- call s:check_col_calc(5, 1, 1)
- exe "normal \<C-E>"
- " Move down only 1 line when the <<< display is on the number column
- call s:check_col_calc(5, 1, 17)
- exe "normal \<C-Y>"
- call s:check_col_calc(5, 2, 17)
- normal ggg$
- exe "normal \<C-E>"
- call s:check_col_calc(20, 1, 32)
- exe "normal \<C-Y>"
- call s:check_col_calc(20, 2, 32)
- normal gg
- setl numberwidth=1
- " Move down another line when numberwidth is too short to cover the whole
- " <<< display
- call s:check_col_calc(3, 1, 1)
- exe "normal \<C-E>"
- call s:check_col_calc(3, 2, 37)
- exe "normal \<C-Y>"
- call s:check_col_calc(3, 3, 37)
- normal ggl
- " Only move 1 line down when we are just past the <<< display
- call s:check_col_calc(4, 1, 2)
- exe "normal \<C-E>"
- call s:check_col_calc(4, 1, 20)
- exe "normal \<C-Y>"
- call s:check_col_calc(4, 2, 20)
- normal gg
- setl numberwidth&
- " Test number + showbreak, so test that the additional indentation works
- setl number showbreak=+++
- call s:check_col_calc(5, 1, 1)
- exe "normal \<C-E>"
- call s:check_col_calc(8, 1, 17)
- exe "normal \<C-Y>"
- call s:check_col_calc(8, 2, 17)
- normal gg
- " Test number + cpo+=n mode, where wrapped lines aren't indented
- setl number cpo+=n showbreak=
- call s:check_col_calc(5, 1, 1)
- exe "normal \<C-E>"
- call s:check_col_calc(1, 2, 37)
- exe "normal \<C-Y>"
- call s:check_col_calc(1, 3, 37)
- normal gg
- " Test list + listchars "precedes", where there is always 1 overlap
- " regardless of number and cpo-=n.
- setl number list listchars=precedes:< cpo-=n
- call s:check_col_calc(5, 1, 1)
- exe "normal 3|\<C-E>h"
- call s:check_col_calc(6, 1, 18)
- norm h
- call s:check_col_calc(5, 2, 17)
- normal gg
- bwipe!
- endfunc
- func Test_smoothscroll_cursor_scrolloff()
- call NewWindow(10, 20)
- setl smoothscroll wrap
- setl scrolloff=3
- " 120 chars are 6 screen lines
- call setline(1, "abcdefghijklmnopqrstABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrstABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrstABCDEFGHIJKLMNOPQRST")
- call setline(2, "below")
- call s:check_col_calc(1, 1, 1)
- " CTRL-E shows "<<<DEFG...", cursor move four lines down
- exe "normal \<C-E>"
- call s:check_col_calc(1, 4, 81)
- " cursor on start of second line, "gk" moves into first line, skipcol doesn't
- " change
- exe "normal G0gk"
- call s:check_col_calc(1, 5, 101)
- " move cursor left one window width worth, scrolls one screen line
- exe "normal 20h"
- call s:check_col_calc(1, 5, 81)
- " move cursor left one window width worth, scrolls one screen line
- exe "normal 20h"
- call s:check_col_calc(1, 4, 61)
- " cursor on last line, "gk" should not cause a scroll
- set scrolloff=0
- normal G0
- call s:check_col_calc(1, 7, 1)
- normal gk
- call s:check_col_calc(1, 6, 101)
- bwipe!
- endfunc
- " Test that mouse picking is still accurate when we have smooth scrolled lines
- func Test_smoothscroll_mouse_pos()
- CheckNotGui
- CheckUnix
- let save_mouse = &mouse
- "let save_term = &term
- "let save_ttymouse = &ttymouse
- set mouse=a "term=xterm ttymouse=xterm2
- call NewWindow(10, 20)
- setl smoothscroll wrap
- " First line will wrap to 3 physical lines. 2nd/3rd lines are short lines.
- call setline(1, ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "line 2", "line 3"])
- func s:check_mouse_click(row, col, buf_row, buf_col)
- call MouseLeftClick(a:row, a:col)
- call assert_equal(a:col, wincol())
- call assert_equal(a:row, winline())
- call assert_equal(a:buf_row, line('.'))
- call assert_equal(a:buf_col, col('.'))
- endfunc
- " Check that clicking without scroll works first.
- call s:check_mouse_click(3, 5, 1, 45)
- call s:check_mouse_click(4, 1, 2, 1)
- call s:check_mouse_click(4, 6, 2, 6)
- call s:check_mouse_click(5, 1, 3, 1)
- call s:check_mouse_click(5, 6, 3, 6)
- " Smooth scroll, and checks that this didn't mess up mouse clicking
- exe "normal \<C-E>"
- call s:check_mouse_click(2, 5, 1, 45)
- call s:check_mouse_click(3, 1, 2, 1)
- call s:check_mouse_click(3, 6, 2, 6)
- call s:check_mouse_click(4, 1, 3, 1)
- call s:check_mouse_click(4, 6, 3, 6)
- exe "normal \<C-E>"
- call s:check_mouse_click(1, 5, 1, 45)
- call s:check_mouse_click(2, 1, 2, 1)
- call s:check_mouse_click(2, 6, 2, 6)
- call s:check_mouse_click(3, 1, 3, 1)
- call s:check_mouse_click(3, 6, 3, 6)
- " Make a new first line 11 physical lines tall so it's taller than window
- " height, to test overflow calculations with really long lines wrapping.
- normal gg
- call setline(1, "12345678901234567890"->repeat(11))
- exe "normal 6\<C-E>"
- call s:check_mouse_click(5, 1, 1, 201)
- call s:check_mouse_click(6, 1, 2, 1)
- call s:check_mouse_click(7, 1, 3, 1)
- let &mouse = save_mouse
- "let &term = save_term
- "let &ttymouse = save_ttymouse
- bwipe!
- endfunc
- " this was dividing by zero
- func Test_smoothscroll_zero_width()
- CheckScreendump
- let lines =<< trim END
- winsize 0 0
- vsplit
- vsplit
- vsplit
- vsplit
- vsplit
- sil norm H
- set wrap
- set smoothscroll
- set number
- END
- call writefile(lines, 'XSmoothScrollZero', 'D')
- let buf = RunVimInTerminal('-u NONE -i NONE -n -m -X -Z -e -s -S XSmoothScrollZero', #{rows: 6, cols: 60, wait_for_ruler: 0})
- call VerifyScreenDump(buf, 'Test_smoothscroll_zero_1', {})
- call term_sendkeys(buf, ":sil norm \<C-V>\<C-W>\<C-V>\<C-N>\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_zero_2', {})
- call StopVimInTerminal(buf)
- endfunc
- " this was unnecessarily inserting lines
- func Test_smoothscroll_ins_lines()
- CheckScreendump
- let lines =<< trim END
- set wrap
- set smoothscroll
- set scrolloff=0
- set conceallevel=2
- call setline(1, [
- \'line one' .. 'with lots of text in one line '->repeat(2),
- \'line two',
- \'line three',
- \'line four',
- \'line five'
- \])
- END
- call writefile(lines, 'XSmoothScrollInsLines', 'D')
- let buf = RunVimInTerminal('-S XSmoothScrollInsLines', #{rows: 6, cols: 40})
- call term_sendkeys(buf, "\<C-E>gjgk")
- call VerifyScreenDump(buf, 'Test_smooth_ins_lines', {})
- call StopVimInTerminal(buf)
- endfunc
- " this placed the cursor in the command line
- func Test_smoothscroll_cursormoved_line()
- CheckScreendump
- let lines =<< trim END
- set smoothscroll
- call setline(1, [
- \'',
- \'_'->repeat(&lines * &columns),
- \(('_')->repeat(&columns - 2) .. 'xxx')->repeat(2)
- \])
- autocmd CursorMoved * eval [line('w0'), line('w$')]
- call search('xxx')
- END
- call writefile(lines, 'XSmoothCursorMovedLine', 'D')
- let buf = RunVimInTerminal('-S XSmoothCursorMovedLine', #{rows: 6})
- call VerifyScreenDump(buf, 'Test_smooth_cursormoved_line', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_eob()
- CheckScreendump
- let lines =<< trim END
- set smoothscroll
- call setline(1, ['']->repeat(100))
- norm G
- END
- call writefile(lines, 'XSmoothEob', 'D')
- let buf = RunVimInTerminal('-S XSmoothEob', #{rows: 10})
- " does not scroll halfway when scrolling to end of buffer
- call VerifyScreenDump(buf, 'Test_smooth_eob_1', {})
- " cursor is not placed below window
- call term_sendkeys(buf, ":call setline(92, 'a'->repeat(100))\<CR>\<C-L>\<C-B>G")
- call VerifyScreenDump(buf, 'Test_smooth_eob_2', {})
- call StopVimInTerminal(buf)
- endfunc
- " skipcol should not reset when doing incremental search on the same word
- func Test_smoothscroll_incsearch()
- CheckScreendump
- let lines =<< trim END
- set smoothscroll number scrolloff=0 incsearch
- call setline(1, repeat([''], 20))
- call setline(11, repeat('a', 100))
- call setline(14, 'bbbb')
- END
- call writefile(lines, 'XSmoothIncsearch', 'D')
- let buf = RunVimInTerminal('-S XSmoothIncsearch', #{rows: 8, cols: 40})
- call term_sendkeys(buf, "/b")
- call VerifyScreenDump(buf, 'Test_smooth_incsearch_1', {})
- call term_sendkeys(buf, "b")
- call VerifyScreenDump(buf, 'Test_smooth_incsearch_2', {})
- call term_sendkeys(buf, "b")
- call VerifyScreenDump(buf, 'Test_smooth_incsearch_3', {})
- call term_sendkeys(buf, "b")
- call VerifyScreenDump(buf, 'Test_smooth_incsearch_4', {})
- call term_sendkeys(buf, "\<CR>")
- call StopVimInTerminal(buf)
- endfunc
- " Test scrolling multiple lines and stopping at non-zero skipcol.
- func Test_smoothscroll_multi_skipcol()
- CheckScreendump
- let lines =<< trim END
- setlocal cursorline scrolloff=0 smoothscroll
- call setline(1, repeat([''], 8))
- call setline(3, repeat('a', 50))
- call setline(4, repeat('a', 50))
- call setline(7, 'bbb')
- call setline(8, 'ccc')
- redraw
- END
- call writefile(lines, 'XSmoothMultiSkipcol', 'D')
- let buf = RunVimInTerminal('-S XSmoothMultiSkipcol', #{rows: 10, cols: 40})
- call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_1', {})
- call term_sendkeys(buf, "3\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_2', {})
- call term_sendkeys(buf, "2\<C-E>")
- call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_3', {})
- call StopVimInTerminal(buf)
- endfunc
- " this was dividing by zero bug in scroll_cursor_bot
- func Test_smoothscroll_zero_width_scroll_cursor_bot()
- CheckScreendump
- let lines =<< trim END
- silent normal yy
- silent normal 19p
- set cpoptions+=n
- vsplit
- vertical resize 0
- set foldcolumn=1
- set number
- set smoothscroll
- silent normal 20G
- END
- call writefile(lines, 'XSmoothScrollZeroBot', 'D')
- let buf = RunVimInTerminal('-u NONE -S XSmoothScrollZeroBot', #{rows: 19})
- call VerifyScreenDump(buf, 'Test_smoothscroll_zero_bot', {})
- call StopVimInTerminal(buf)
- endfunc
- " scroll_cursor_top() should reset skipcol when it changes topline
- func Test_smoothscroll_cursor_top()
- CheckScreendump
- let lines =<< trim END
- set smoothscroll scrolloff=2
- new | 11resize | wincmd j
- call setline(1, ['line1', 'line2', 'line3'->repeat(20), 'line4'])
- exe "norm G3\<C-E>k"
- END
- call writefile(lines, 'XSmoothScrollCursorTop', 'D')
- let buf = RunVimInTerminal('-u NONE -S XSmoothScrollCursorTop', #{rows: 12, cols: 40})
- call VerifyScreenDump(buf, 'Test_smoothscroll_cursor_top', {})
- call StopVimInTerminal(buf)
- endfunc
- " Division by zero, shouldn't crash
- func Test_smoothscroll_crash()
- CheckScreendump
- let lines =<< trim END
- 20 new
- vsp
- put =repeat('aaaa', 20)
- set nu fdc=1 smoothscroll cpo+=n
- vert resize 0
- exe "norm! 0\<c-e>"
- END
- call writefile(lines, 'XSmoothScrollCrash', 'D')
- let buf = RunVimInTerminal('-u NONE -S XSmoothScrollCrash', #{rows: 12, cols: 40})
- call term_sendkeys(buf, "2\<C-E>\<C-L>")
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_insert_bottom()
- CheckScreendump
- let lines =<< trim END
- call setline(1, repeat([repeat('A very long line ...', 10)], 5))
- set wrap smoothscroll scrolloff=0
- END
- call writefile(lines, 'XSmoothScrollInsertBottom', 'D')
- let buf = RunVimInTerminal('-u NONE -S XSmoothScrollInsertBottom', #{rows: 9, cols: 40})
- call term_sendkeys(buf, "Go123456789\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_insert_bottom', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_in_qf_window()
- CheckFeature quickfix
- CheckScreendump
- let lines =<< trim END
- set nocompatible display=lastline
- copen 5
- setlocal number smoothscroll
- let g:l = [{'text': 'foo'}] + repeat([{'text': join(range(30))}], 10)
- call setqflist(g:l, 'r')
- normal! G
- wincmd t
- let g:l1 = [{'text': join(range(1000))}]
- END
- call writefile(lines, 'XSmoothScrollInQfWindow', 'D')
- let buf = RunVimInTerminal('-u NONE -S XSmoothScrollInQfWindow', #{rows: 20, cols: 60})
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_1', {})
- call term_sendkeys(buf, ":call setqflist([], 'r')\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_2', {})
- call term_sendkeys(buf, ":call setqflist(g:l, 'r')\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_3', {})
- call term_sendkeys(buf, ":call setqflist(g:l1, 'r')\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_4', {})
- call term_sendkeys(buf, "\<C-W>b$\<C-W>t")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_5', {})
- call term_sendkeys(buf, ":call setqflist([], 'r')\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_2', {})
- call term_sendkeys(buf, ":call setqflist(g:l1, 'r')\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_4', {})
- call term_sendkeys(buf, "\<C-W>b$\<C-W>t")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_5', {})
- call term_sendkeys(buf, ":call setqflist(g:l, 'r')\<CR>")
- call VerifyScreenDump(buf, 'Test_smoothscroll_in_qf_window_3', {})
- call StopVimInTerminal(buf)
- endfunc
- func Test_smoothscroll_in_zero_width_window()
- set cpo+=n number smoothscroll
- set winwidth=99999 winminwidth=0
- vsplit
- call assert_equal(0, winwidth(winnr('#')))
- call win_execute(win_getid(winnr('#')), "norm! \<C-Y>")
- only!
- set winwidth& winminwidth&
- set cpo-=n nonumber nosmoothscroll
- endfunc
- func Test_smoothscroll_textoff_small_winwidth()
- set smoothscroll number
- call setline(1, 'llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch')
- vsplit
- let textoff = getwininfo(win_getid())[0].textoff
- execute 'vertical resize' textoff + 1
- redraw
- call assert_equal(0, winsaveview().skipcol)
- execute "normal! 0\<C-E>"
- redraw
- call assert_equal(1, winsaveview().skipcol)
- execute 'vertical resize' textoff - 1
- " This caused a signed integer overflow.
- redraw
- call assert_equal(1, winsaveview().skipcol)
- execute 'vertical resize' textoff
- " This caused an infinite loop.
- redraw
- call assert_equal(1, winsaveview().skipcol)
- %bw!
- set smoothscroll& number&
- endfunc
- func Test_smoothscroll_page()
- call NewWindow(10, 40)
- setlocal smoothscroll
- call setline(1, 'abcde '->repeat(150))
- exe "norm! \<C-F>"
- call assert_equal(400, winsaveview().skipcol)
- exe "norm! \<C-F>"
- call assert_equal(800, winsaveview().skipcol)
- exe "norm! \<C-F>"
- call assert_equal(880, winsaveview().skipcol)
- exe "norm! \<C-B>"
- call assert_equal(480, winsaveview().skipcol)
- exe "norm! \<C-B>"
- call assert_equal(80, winsaveview().skipcol)
- exe "norm! \<C-B>"
- call assert_equal(0, winsaveview().skipcol)
- " Half-page scrolling does not go beyond end of buffer and moves the cursor.
- " Even with 'nostartofline', the correct amount of lines is scrolled.
- setl nostartofline
- exe "norm! 15|\<C-D>"
- call assert_equal(200, winsaveview().skipcol)
- call assert_equal(215, col('.'))
- exe "norm! \<C-D>"
- call assert_equal(400, winsaveview().skipcol)
- call assert_equal(415, col('.'))
- exe "norm! \<C-D>"
- call assert_equal(520, winsaveview().skipcol)
- call assert_equal(615, col('.'))
- exe "norm! \<C-D>"
- call assert_equal(520, winsaveview().skipcol)
- call assert_equal(815, col('.'))
- exe "norm! \<C-D>"
- call assert_equal(520, winsaveview().skipcol)
- call assert_equal(895, col('.'))
- exe "norm! \<C-U>"
- call assert_equal(320, winsaveview().skipcol)
- call assert_equal(695, col('.'))
- exe "norm! \<C-U>"
- call assert_equal(120, winsaveview().skipcol)
- call assert_equal(495, col('.'))
- exe "norm! \<C-U>"
- call assert_equal(0, winsaveview().skipcol)
- call assert_equal(295, col('.'))
- exe "norm! \<C-U>"
- call assert_equal(0, winsaveview().skipcol)
- call assert_equal(95, col('.'))
- exe "norm! \<C-U>"
- call assert_equal(0, winsaveview().skipcol)
- call assert_equal(15, col('.'))
- bwipe!
- endfunc
- func Test_smoothscroll_next_topline()
- call NewWindow(10, 40)
- setlocal smoothscroll
- call setline(1, ['abcde '->repeat(150)]->repeat(2))
- " Scrolling a screenline that causes the cursor to move to the next buffer
- " line should not skip part of that line to bring the cursor into view.
- exe "norm! 22\<C-E>"
- call assert_equal(880, winsaveview().skipcol)
- exe "norm! \<C-E>"
- redraw
- call assert_equal(0, winsaveview().skipcol)
- " Also when scrolling back.
- exe "norm! G\<C-Y>"
- redraw
- call assert_equal(880, winsaveview().skipcol)
- " Cursor in correct place when not in the first screenline of a buffer line.
- exe "norm! gg4gj20\<C-D>\<C-D>"
- redraw
- call assert_equal(2, line('w0'))
- " Cursor does not end up above topline, adjusting topline later.
- setlocal nu cpo+=n
- exe "norm! G$g013\<C-Y>"
- redraw
- call assert_equal(2, line('.'))
- call assert_equal(0, winsaveview().skipcol)
- set cpo-=n
- bwipe!
- endfunc
- func Test_smoothscroll_long_line_zb()
- call NewWindow(10, 40)
- call setline(1, 'abcde '->repeat(150))
- " Also works without 'smoothscroll' when last line of buffer doesn't fit.
- " Used to set topline to buffer line count plus one, causing an empty screen.
- norm zb
- redraw
- call assert_equal(1, winsaveview().topline)
- " Moving cursor to bottom works on line that doesn't fit with 'smoothscroll'.
- " Skipcol was adjusted later for cursor being on not visible part of line.
- setlocal smoothscroll
- norm zb
- redraw
- call assert_equal(520, winsaveview().skipcol)
- bwipe!
- endfunc
- func Test_smooth_long_scrolloff()
- CheckScreendump
- let lines =<< trim END
- set smoothscroll scrolloff=3
- call setline(1, ['one', 'two long '->repeat(100), 'three', 'four', 'five', 'six'])
- END
- call writefile(lines, 'XSmoothLongScrolloff', 'D')
- let buf = RunVimInTerminal('-u NONE -S XSmoothLongScrolloff', #{rows: 8, cols: 40})
- call term_sendkeys(buf, ":norm j721|\<CR>")
- call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_1', {})
- call term_sendkeys(buf, "gj")
- call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_2', {})
- call term_sendkeys(buf, "gj")
- call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_3', {})
- call term_sendkeys(buf, "gj")
- call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_4', {})
- call term_sendkeys(buf, "gj")
- call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_5', {})
- call term_sendkeys(buf, "gj")
- call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_6', {})
- call term_sendkeys(buf, "gk")
- call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_7', {})
- call StopVimInTerminal(buf)
- endfunc
- " vim: shiftwidth=2 sts=2 expandtab
|