mirror of
https://github.com/neovim/neovim.git
synced 2024-12-24 21:25:04 -07:00
da3facb7ee
Problem: Redrawing can be improved when inserting/deleting lines with 'number'.
Solution: Only redraw the number column of lines below changed lines.
Add a test as this wasn't previously tested.
(zeertzjq)
closes: vim/vim#13985
ae07ebc04b
409 lines
8.9 KiB
VimL
409 lines
8.9 KiB
VimL
" Test for 'number' and 'relativenumber'
|
|
|
|
source check.vim
|
|
source view_util.vim
|
|
|
|
source screendump.vim
|
|
|
|
func s:screen_lines(start, end) abort
|
|
return ScreenLines([a:start, a:end], 8)
|
|
endfunc
|
|
|
|
func s:compare_lines(expect, actual)
|
|
call assert_equal(a:expect, a:actual)
|
|
endfunc
|
|
|
|
func s:test_windows(h, w) abort
|
|
call NewWindow(a:h, a:w)
|
|
endfunc
|
|
|
|
func s:close_windows() abort
|
|
call CloseWindow()
|
|
endfunc
|
|
|
|
func s:validate_cursor() abort
|
|
" update skipcol.
|
|
" wincol():
|
|
" f_wincol
|
|
" -> validate_cursor
|
|
" -> curs_columns
|
|
call wincol()
|
|
endfunc
|
|
|
|
func Test_set_options()
|
|
set nu rnu
|
|
call assert_equal(1, &nu)
|
|
call assert_equal(1, &rnu)
|
|
|
|
call s:test_windows(10, 20)
|
|
call assert_equal(1, &nu)
|
|
call assert_equal(1, &rnu)
|
|
call s:close_windows()
|
|
|
|
set nu& rnu&
|
|
endfunc
|
|
|
|
func Test_set_global_and_local()
|
|
" setlocal must NOT reset the other global value
|
|
set nonu nornu
|
|
setglobal nu
|
|
setlocal rnu
|
|
call assert_equal(1, &g:nu)
|
|
|
|
set nonu nornu
|
|
setglobal rnu
|
|
setlocal nu
|
|
call assert_equal(1, &g:rnu)
|
|
|
|
" setglobal MUST reset the other global value
|
|
set nonu nornu
|
|
setglobal nu
|
|
setglobal rnu
|
|
call assert_equal(1, &g:nu)
|
|
|
|
set nonu nornu
|
|
setglobal rnu
|
|
setglobal nu
|
|
call assert_equal(1, &g:rnu)
|
|
|
|
" set MUST reset the other global value
|
|
set nonu nornu
|
|
set nu
|
|
set rnu
|
|
call assert_equal(1, &g:nu)
|
|
|
|
set nonu nornu
|
|
set rnu
|
|
set nu
|
|
call assert_equal(1, &g:rnu)
|
|
|
|
set nu& rnu&
|
|
endfunc
|
|
|
|
func Test_number()
|
|
call s:test_windows(10, 20)
|
|
call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
|
|
setl number
|
|
let lines = s:screen_lines(1, 4)
|
|
let expect = [
|
|
\ " 1 abcd",
|
|
\ " 2 klmn",
|
|
\ " 3 uvwx",
|
|
\ " 4 EFGH",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
func Test_relativenumber()
|
|
call s:test_windows(10, 20)
|
|
call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
|
|
3
|
|
setl relativenumber
|
|
let lines = s:screen_lines(1, 6)
|
|
let expect = [
|
|
\ " 2 abcd",
|
|
\ " 1 klmn",
|
|
\ " 0 uvwx",
|
|
\ " 1 EFGH",
|
|
\ " 2 OPQR",
|
|
\ " 3 YZ ",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
func Test_number_with_relativenumber()
|
|
call s:test_windows(10, 20)
|
|
call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
|
|
4
|
|
setl number relativenumber
|
|
let lines = s:screen_lines(1, 6)
|
|
let expect = [
|
|
\ " 3 abcd",
|
|
\ " 2 klmn",
|
|
\ " 1 uvwx",
|
|
\ "4 EFGH",
|
|
\ " 1 OPQR",
|
|
\ " 2 YZ ",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
func Test_number_with_linewrap1()
|
|
call s:test_windows(3, 20)
|
|
normal! 61ia
|
|
setl number wrap
|
|
call s:validate_cursor()
|
|
let lines = s:screen_lines(1, 3)
|
|
let expect = [
|
|
\ "<<< aaaa",
|
|
\ " aaaa",
|
|
\ " aaaa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
func Test_number_with_linewrap2()
|
|
call s:test_windows(3, 20)
|
|
normal! 61ia
|
|
setl number wrap
|
|
call s:validate_cursor()
|
|
0
|
|
call s:validate_cursor()
|
|
let lines = s:screen_lines(1, 3)
|
|
let expect = [
|
|
\ " 1 aaaa",
|
|
\ " aaaa",
|
|
\ " aaaa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
func Test_number_with_linewrap3()
|
|
call s:test_windows(4, 20)
|
|
normal! 81ia
|
|
setl number wrap
|
|
call s:validate_cursor()
|
|
setl nonumber
|
|
call s:validate_cursor()
|
|
let lines = s:screen_lines(1, 4)
|
|
let expect = [
|
|
\ "<<<aaaaa",
|
|
\ "aaaaaaaa",
|
|
\ "aaaaaaaa",
|
|
\ "a ",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
func Test_numberwidth()
|
|
call s:test_windows(10, 20)
|
|
call setline(1, repeat(['aaaa'], 10))
|
|
setl number numberwidth=6
|
|
let lines = s:screen_lines(1, 3)
|
|
let expect = [
|
|
\ " 1 aa",
|
|
\ " 2 aa",
|
|
\ " 3 aa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
|
|
set relativenumber
|
|
let lines = s:screen_lines(1, 3)
|
|
let expect = [
|
|
\ "1 aa",
|
|
\ " 1 aa",
|
|
\ " 2 aa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
|
|
set nonumber
|
|
let lines = s:screen_lines(1, 3)
|
|
let expect = [
|
|
\ " 0 aa",
|
|
\ " 1 aa",
|
|
\ " 2 aa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
func Test_numberwidth_adjusted()
|
|
call s:test_windows(10, 20)
|
|
call setline(1, repeat(['aaaa'], 10000))
|
|
setl number numberwidth=4
|
|
let lines = s:screen_lines(1, 3)
|
|
let expect = [
|
|
\ " 1 aa",
|
|
\ " 2 aa",
|
|
\ " 3 aa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
|
|
$
|
|
let lines = s:screen_lines(8, 10)
|
|
let expect = [
|
|
\ " 9998 aa",
|
|
\ " 9999 aa",
|
|
\ "10000 aa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
|
|
setl relativenumber
|
|
let lines = s:screen_lines(8, 10)
|
|
let expect = [
|
|
\ " 2 aa",
|
|
\ " 1 aa",
|
|
\ "10000 aa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
|
|
setl nonumber
|
|
let lines = s:screen_lines(8, 10)
|
|
let expect = [
|
|
\ " 2 aaaa",
|
|
\ " 1 aaaa",
|
|
\ " 0 aaaa",
|
|
\ ]
|
|
call s:compare_lines(expect, lines)
|
|
call s:close_windows()
|
|
endfunc
|
|
|
|
" This was causing a memcheck error
|
|
func Test_relativenumber_uninitialised()
|
|
new
|
|
set rnu
|
|
call setline(1, ["a", "b"])
|
|
redraw
|
|
call feedkeys("j", 'xt')
|
|
redraw
|
|
bwipe!
|
|
endfunc
|
|
|
|
func Test_relativenumber_colors()
|
|
CheckScreendump
|
|
|
|
let lines =<< trim [CODE]
|
|
call setline(1, range(200))
|
|
111
|
|
set number relativenumber
|
|
hi LineNr ctermfg=red
|
|
[CODE]
|
|
call writefile(lines, 'XTest_relnr', 'D')
|
|
|
|
let buf = RunVimInTerminal('-S XTest_relnr', {'rows': 10, 'cols': 50})
|
|
" Default colors
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_1', {})
|
|
|
|
call term_sendkeys(buf, ":hi LineNrAbove ctermfg=blue\<CR>:\<CR>")
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_2', {})
|
|
|
|
call term_sendkeys(buf, ":hi LineNrBelow ctermfg=green\<CR>:\<CR>")
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_3', {})
|
|
|
|
call term_sendkeys(buf, ":hi clear LineNrAbove\<CR>")
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_4', {})
|
|
|
|
" clean up
|
|
call StopVimInTerminal(buf)
|
|
endfunc
|
|
|
|
func Test_relativenumber_colors_wrapped()
|
|
CheckScreendump
|
|
|
|
let lines =<< trim [CODE]
|
|
set display=lastline scrolloff=0
|
|
call setline(1, range(200)->map('v:val->string()->repeat(40)'))
|
|
111
|
|
set number relativenumber
|
|
hi LineNr ctermbg=red ctermfg=black
|
|
hi LineNrAbove ctermbg=blue ctermfg=black
|
|
hi LineNrBelow ctermbg=green ctermfg=black
|
|
[CODE]
|
|
call writefile(lines, 'XTest_relnr_wrap', 'D')
|
|
|
|
let buf = RunVimInTerminal('-S XTest_relnr_wrap', {'rows': 20, 'cols': 50})
|
|
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_1', {})
|
|
call term_sendkeys(buf, "k")
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_2', {})
|
|
call term_sendkeys(buf, "2j")
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_3', {})
|
|
call term_sendkeys(buf, "2j")
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_4', {})
|
|
call term_sendkeys(buf, "k")
|
|
call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_5', {})
|
|
|
|
" clean up
|
|
call StopVimInTerminal(buf)
|
|
endfunc
|
|
|
|
func Test_relativenumber_callback()
|
|
CheckScreendump
|
|
CheckFeature timers
|
|
|
|
let lines =<< trim END
|
|
call setline(1, ['aaaaa', 'bbbbb', 'ccccc', 'ddddd'])
|
|
set relativenumber
|
|
call cursor(4, 1)
|
|
|
|
func Func(timer)
|
|
call cursor(1, 1)
|
|
endfunc
|
|
|
|
call timer_start(300, 'Func')
|
|
END
|
|
call writefile(lines, 'Xrnu_timer', 'D')
|
|
|
|
let buf = RunVimInTerminal('-S Xrnu_timer', #{rows: 8})
|
|
call TermWait(buf, 310)
|
|
call VerifyScreenDump(buf, 'Test_relativenumber_callback_1', {})
|
|
|
|
call StopVimInTerminal(buf)
|
|
endfunc
|
|
|
|
" Test that line numbers below inserted/deleted lines are updated.
|
|
func Test_number_insert_delete_lines()
|
|
CheckScreendump
|
|
|
|
let lines =<< trim END
|
|
call setline(1, range(1, 7))
|
|
set number
|
|
call cursor(2, 1)
|
|
END
|
|
call writefile(lines, 'Xnumber_insert_delete_lines', 'D')
|
|
|
|
let buf = RunVimInTerminal('-S Xnumber_insert_delete_lines', #{rows: 8})
|
|
call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
|
|
call term_sendkeys(buf, "dd")
|
|
call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_2', {})
|
|
call term_sendkeys(buf, "P")
|
|
call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
|
|
call term_sendkeys(buf, "2dd")
|
|
call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_3', {})
|
|
call term_sendkeys(buf, "P")
|
|
call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
|
|
|
|
call StopVimInTerminal(buf)
|
|
endfunc
|
|
|
|
" Test for displaying line numbers with 'rightleft'
|
|
func Test_number_rightleft()
|
|
CheckFeature rightleft
|
|
new
|
|
setlocal number
|
|
setlocal rightleft
|
|
call setline(1, range(1, 1000))
|
|
normal! 9Gzt
|
|
redraw!
|
|
call assert_match('^\s\+9 9$', Screenline(1))
|
|
normal! 10Gzt
|
|
redraw!
|
|
call assert_match('^\s\+01 10$', Screenline(1))
|
|
normal! 100Gzt
|
|
redraw!
|
|
call assert_match('^\s\+001 100$', Screenline(1))
|
|
normal! 1000Gzt
|
|
redraw!
|
|
call assert_match('^\s\+0001 1000$', Screenline(1))
|
|
bw!
|
|
endfunc
|
|
|
|
" This used to cause a divide by zero
|
|
func Test_number_no_text_virtual_edit()
|
|
vnew
|
|
call setline(1, ['line one', 'line two'])
|
|
set number virtualedit=all
|
|
normal w
|
|
4wincmd |
|
|
normal j
|
|
bwipe!
|
|
endfunc
|
|
|
|
" vim: shiftwidth=2 sts=2 expandtab
|