mirror of
https://github.com/vim/vim.git
synced 2025-10-18 07:54:29 -04:00
patch 9.1.1009: diff feature can be improved
Problem: diff feature can be improved Solution: include the linematch diff alignment algorithm (Jonathon) closes: #9661 Signed-off-by: Jonathon <jonathonwhite@protonmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
faf250c9e4
commit
7c7a4e6d1a
@@ -1035,6 +1035,41 @@ func Test_diff_screen()
|
||||
call WriteDiffFiles(buf, [], [0])
|
||||
call VerifyBoth(buf, "Test_diff_22", "")
|
||||
|
||||
call WriteDiffFiles(buf, ['?a', '?b', '?c'], ['!b'])
|
||||
call VerifyInternal(buf, 'Test_diff_23', " diffopt+=linematch:30")
|
||||
|
||||
call WriteDiffFiles(buf, ['',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ '',
|
||||
\ 'DEFabc',
|
||||
\ 'xyz',
|
||||
\ 'xyz',
|
||||
\ 'xyz',
|
||||
\ 'DEFabc',
|
||||
\ 'DEFabc',
|
||||
\ 'DEFabc',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ 'DEF',
|
||||
\ 'common line',
|
||||
\ 'DEF',
|
||||
\ 'something' ],
|
||||
\ ['',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ '',
|
||||
\ 'ABCabc',
|
||||
\ 'ABCabc',
|
||||
\ 'ABCabc',
|
||||
\ 'ABCabc',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ 'something'])
|
||||
call VerifyInternal(buf, 'Test_diff_24', " diffopt+=linematch:30")
|
||||
|
||||
|
||||
" clean up
|
||||
call StopVimInTerminal(buf)
|
||||
call delete('Xdifile1')
|
||||
@@ -2285,4 +2320,411 @@ func Test_diff_topline_noscroll()
|
||||
call term_sendkeys(buf, "\<C-W>p")
|
||||
call term_wait(buf)
|
||||
call VerifyScreenDump(buf, 'Test_diff_topline_4', {})
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
||||
func Test_diffget_diffput_linematch()
|
||||
CheckScreendump
|
||||
call delete('.Xdifile1.swp')
|
||||
call delete('.Xdifile2.swp')
|
||||
call WriteDiffFiles(0, [], [])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2', {})
|
||||
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
|
||||
|
||||
" enable linematch
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||
call WriteDiffFiles(buf, ['',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ '',
|
||||
\ 'ABCabc',
|
||||
\ 'ABCabc',
|
||||
\ 'ABCabc',
|
||||
\ 'ABCabc',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ 'something' ],
|
||||
\ ['',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ '',
|
||||
\ 'DEFabc',
|
||||
\ 'xyz',
|
||||
\ 'xyz',
|
||||
\ 'xyz',
|
||||
\ 'DEFabc',
|
||||
\ 'DEFabc',
|
||||
\ 'DEFabc',
|
||||
\ 'common line',
|
||||
\ 'common line',
|
||||
\ 'DEF',
|
||||
\ 'common line',
|
||||
\ 'DEF',
|
||||
\ 'something'])
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_1', {})
|
||||
|
||||
" get from window 1 from line 5 to 9
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, ":5,9diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_2', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get from window 2 from line 5 to 10
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, ":5,10diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_3', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get all from window 2
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, ":4,17diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_4', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get all from window 1
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, ":4,12diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_5', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get from window 1 using do 1 line 5
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "5gg")
|
||||
call term_sendkeys(buf, ":diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_6', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get from window 1 using do 2 line 6
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "6gg")
|
||||
call term_sendkeys(buf, ":diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_7', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get from window 1 using do 2 line 7
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "7gg")
|
||||
call term_sendkeys(buf, ":diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_8', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get from window 1 using do 2 line 11
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "11gg")
|
||||
call term_sendkeys(buf, ":diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_9', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" get from window 1 using do 2 line 12
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "12gg")
|
||||
call term_sendkeys(buf, ":diffget\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_10', {})
|
||||
|
||||
" undo the last diffget
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 1 using dp 1 line 5
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "5gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_11', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 1 using dp 2 line 6
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "6gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_12', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 1 using dp 2 line 7
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "7gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_13', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 1 using dp 2 line 11
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "11gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_14', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 1 using dp 2 line 12
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "12gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_15', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 2 using dp line 6
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "6gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_16', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 2 using dp line 8
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "8gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_17', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 2 using dp line 9
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "9gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_18', {})
|
||||
|
||||
" undo the last diffput
|
||||
call term_sendkeys(buf, "1\<c-w>w")
|
||||
call term_sendkeys(buf, "u")
|
||||
|
||||
" put from window 2 using dp line 17
|
||||
call term_sendkeys(buf, "2\<c-w>w")
|
||||
call term_sendkeys(buf, "17gg")
|
||||
call term_sendkeys(buf, ":diffput\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_diff_get_put_linematch_19', {})
|
||||
|
||||
endfunc
|
||||
|
||||
func Test_linematch_diff()
|
||||
CheckScreendump
|
||||
call delete('.Xdifile1.swp')
|
||||
call delete('.Xdifile2.swp')
|
||||
call WriteDiffFiles(0, [], [])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2', {})
|
||||
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
|
||||
|
||||
" enable linematch
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||
call WriteDiffFiles(buf, ['// abc d?',
|
||||
\ '// d?',
|
||||
\ '// d?' ],
|
||||
\ ['!',
|
||||
\ 'abc d!',
|
||||
\ 'd!'])
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff1', {})
|
||||
|
||||
endfunc
|
||||
|
||||
func Test_linematch_diff_iwhite()
|
||||
CheckScreendump
|
||||
call delete('.Xdifile1.swp')
|
||||
call delete('.Xdifile2.swp')
|
||||
call WriteDiffFiles(0, [], [])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2', {})
|
||||
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
|
||||
|
||||
" setup a diff with 2 files and set linematch:30, with ignore white
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||
call WriteDiffFiles(buf, ['void testFunction () {',
|
||||
\ ' for (int i = 0; i < 10; i++) {',
|
||||
\ ' for (int j = 0; j < 10; j++) {',
|
||||
\ ' }',
|
||||
\ ' }',
|
||||
\ '}' ],
|
||||
\ ['void testFunction () {',
|
||||
\ ' // for (int j = 0; j < 10; i++) {',
|
||||
\ ' // }',
|
||||
\ '}'])
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff_iwhite1', {})
|
||||
call term_sendkeys(buf, ":set diffopt+=iwhiteall\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff_iwhite2', {})
|
||||
|
||||
endfunc
|
||||
|
||||
func Test_linematch_diff_grouping()
|
||||
CheckScreendump
|
||||
call delete('.Xdifile1.swp')
|
||||
call delete('.Xdifile2.swp')
|
||||
call WriteDiffFiles(0, [], [])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2', {})
|
||||
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
|
||||
|
||||
" a diff that would result in multiple groups before grouping optimization
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||
call WriteDiffFiles(buf, ['!A',
|
||||
\ '!B',
|
||||
\ '!C' ],
|
||||
\ ['?Z',
|
||||
\ '?A',
|
||||
\ '?B',
|
||||
\ '?C',
|
||||
\ '?A',
|
||||
\ '?B',
|
||||
\ '?B',
|
||||
\ '?C'])
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping1', {})
|
||||
call WriteDiffFiles(buf, ['!A',
|
||||
\ '!B',
|
||||
\ '!C' ],
|
||||
\ ['?A',
|
||||
\ '?Z',
|
||||
\ '?B',
|
||||
\ '?C',
|
||||
\ '?A',
|
||||
\ '?B',
|
||||
\ '?C',
|
||||
\ '?C'])
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping2', {})
|
||||
|
||||
endfunc
|
||||
|
||||
func Test_linematch_diff_scroll()
|
||||
CheckScreendump
|
||||
call delete('.Xdifile1.swp')
|
||||
call delete('.Xdifile2.swp')
|
||||
call WriteDiffFiles(0, [], [])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2', {})
|
||||
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
|
||||
|
||||
" a diff that would result in multiple groups before grouping optimization
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||
call WriteDiffFiles(buf, ['!A',
|
||||
\ '!B',
|
||||
\ '!C' ],
|
||||
\ ['?A',
|
||||
\ '?Z',
|
||||
\ '?B',
|
||||
\ '?C',
|
||||
\ '?A',
|
||||
\ '?B',
|
||||
\ '?C',
|
||||
\ '?C'])
|
||||
" scroll down to show calculation of top fill and scroll to correct line in
|
||||
" both windows
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping_scroll0', {})
|
||||
call term_sendkeys(buf, "3\<c-e>")
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping_scroll1', {})
|
||||
call term_sendkeys(buf, "3\<c-e>")
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff_grouping_scroll2', {})
|
||||
|
||||
endfunc
|
||||
|
||||
|
||||
|
||||
func Test_linematch_line_limit_exceeded()
|
||||
CheckScreendump
|
||||
call delete('.Xdifile1.swp')
|
||||
call delete('.Xdifile2.swp')
|
||||
call WriteDiffFiles(0, [], [])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2', {})
|
||||
call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
|
||||
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:10\<CR>")
|
||||
" a diff block will not be aligned with linematch because it's contents
|
||||
" exceed 10 lines
|
||||
call WriteDiffFiles(buf,
|
||||
\ ['common line',
|
||||
\ 'HIL',
|
||||
\ '',
|
||||
\ 'aABCabc',
|
||||
\ 'aABCabc',
|
||||
\ 'aABCabc',
|
||||
\ 'aABCabc',
|
||||
\ 'common line',
|
||||
\ 'HIL',
|
||||
\ 'common line',
|
||||
\ 'something'],
|
||||
\ ['common line',
|
||||
\ 'DEF',
|
||||
\ 'GHI',
|
||||
\ 'something',
|
||||
\ '',
|
||||
\ 'aDEFabc',
|
||||
\ 'xyz',
|
||||
\ 'xyz',
|
||||
\ 'xyz',
|
||||
\ 'aDEFabc',
|
||||
\ 'aDEFabc',
|
||||
\ 'aDEFabc',
|
||||
\ 'common line',
|
||||
\ 'DEF',
|
||||
\ 'GHI',
|
||||
\ 'something else',
|
||||
\ 'common line',
|
||||
\ 'something'])
|
||||
call VerifyScreenDump(buf, 'Test_linematch_line_limit_exceeded1', {})
|
||||
" after increasing the count to 30, the limit is not exceeded, and the
|
||||
" alignment algorithm will run on the largest diff block here
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_linematch_line_limit_exceeded2', {})
|
||||
|
||||
endfunc
|
||||
|
||||
func Test_linematch_3diffs()
|
||||
CheckScreendump
|
||||
call delete('.Xdifile1.swp')
|
||||
call delete('.Xdifile2.swp')
|
||||
call delete('.Xdifile3.swp')
|
||||
call WriteDiffFiles3(0, [], [], [])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2 Xdifile3', {})
|
||||
call term_sendkeys(buf, "1\<c-w>w:set autoread\<CR>")
|
||||
call term_sendkeys(buf, "2\<c-w>w:set autoread\<CR>")
|
||||
call term_sendkeys(buf, "3\<c-w>w:set autoread\<CR>")
|
||||
call term_sendkeys(buf, ":set diffopt+=linematch:30\<CR>")
|
||||
call WriteDiffFiles3(buf,
|
||||
\ ["",
|
||||
\ " common line",
|
||||
\ " AAA",
|
||||
\ " AAA",
|
||||
\ " AAA"],
|
||||
\ ["",
|
||||
\ " common line",
|
||||
\ " <<<<<<< HEAD",
|
||||
\ " AAA",
|
||||
\ " AAA",
|
||||
\ " AAA",
|
||||
\ " =======",
|
||||
\ " BBB",
|
||||
\ " BBB",
|
||||
\ " BBB",
|
||||
\ " >>>>>>> branch1"],
|
||||
\ ["",
|
||||
\ " common line",
|
||||
\ " BBB",
|
||||
\ " BBB",
|
||||
\ " BBB"])
|
||||
call VerifyScreenDump(buf, 'Test_linematch_3diffs1', {})
|
||||
|
Reference in New Issue
Block a user