To: vim_dev@googlegroups.com Subject: Patch 8.2.1235 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1235 Problem: Not all mouse codes covered by tests. Solution: Add more tests for the mouse. (Yegappan Lakshmanan, closes #6472) Files: src/testdir/mouse.vim, src/testdir/test_termcodes.vim *** ../vim-8.2.1234/src/testdir/mouse.vim 2020-07-01 15:49:26.300450527 +0200 --- src/testdir/mouse.vim 2020-07-18 12:57:17.932419998 +0200 *************** *** 103,108 **** --- 103,126 ---- call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!') endfunc + func MouseAltLeftClickCode(row, col) + let alt = 0x8 + return TerminalEscapeCode(0 + alt, a:row, a:col, 'M') + endfunc + + func MouseAltLeftClick(row, col) + call feedkeys(MouseAltLeftClickCode(a:row, a:col), 'Lx!') + endfunc + + func MouseAltRightClickCode(row, col) + let alt = 0x8 + return TerminalEscapeCode(2 + alt, a:row, a:col, 'M') + endfunc + + func MouseAltRightClick(row, col) + call feedkeys(MouseAltRightClickCode(a:row, a:col), 'Lx!') + endfunc + func MouseLeftReleaseCode(row, col) if &ttymouse ==# 'dec' return DecEscapeCode(3, 0, a:row, a:col) *** ../vim-8.2.1234/src/testdir/test_termcodes.vim 2020-07-14 22:11:01.217025006 +0200 --- src/testdir/test_termcodes.vim 2020-07-18 12:57:17.932419998 +0200 *************** *** 147,159 **** new let str = 'iHello' .. MouseCtrlRightClickCode(row, col) \ .. MouseRightReleaseCode(row, col) .. "\" ! call assert_fails('call feedkeys(str, "Lx!")', 'E37:') close! " CTRL-right click with a count let str = "4" .. MouseCtrlRightClickCode(row, col) \ .. MouseRightReleaseCode(row, col) ! call assert_fails('call feedkeys(str, "Lx!")', 'E555:') call assert_match('help.txt$', bufname('%'), msg) call assert_equal(1, line('.'), msg) --- 147,159 ---- new let str = 'iHello' .. MouseCtrlRightClickCode(row, col) \ .. MouseRightReleaseCode(row, col) .. "\" ! call assert_fails('call feedkeys(str, "Lx!")', 'E37:', msg) close! " CTRL-right click with a count let str = "4" .. MouseCtrlRightClickCode(row, col) \ .. MouseRightReleaseCode(row, col) ! call assert_fails('call feedkeys(str, "Lx!")', 'E555:', msg) call assert_match('help.txt$', bufname('%'), msg) call assert_equal(1, line('.'), msg) *************** *** 230,236 **** \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!') call assert_equal(['12345abc6789abc', '12abc3abc456789'], \ getline(1, '$'), msg) ! call assert_equal('1234', @") let &clipboard = save_clipboard " Clicking middle mouse in select mode, replaces the selected text with --- 230,236 ---- \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!') call assert_equal(['12345abc6789abc', '12abc3abc456789'], \ getline(1, '$'), msg) ! call assert_equal('1234', @", msg) let &clipboard = save_clipboard " Clicking middle mouse in select mode, replaces the selected text with *************** *** 240,245 **** --- 240,257 ---- exe "normal gh\\\" call assert_equal(['12xyzabc6789abc', '12abc3abc456789'], \ getline(1, '$'), msg) + + " Prefixing middle click with [ or ] fixes the indent after pasting. + %d + call setline(1, " one two") + call setreg('r', 'red blue', 'l') + call test_setmouse(1, 5) + exe "normal \"r[\" + call assert_equal(' red blue', getline(1), msg) + call test_setmouse(2, 5) + exe "normal \"r]\" + call assert_equal(' red blue', getline(3), msg) + %d endfor let &mouse = save_mouse *************** *** 309,315 **** \ "\", 'Lx!') call assert_equal(['123abc456789', '123456789'], \ getline(1, '$'), msg) ! call assert_equal([1, 6], [line('.'), col('.')]) " Middle-click in replace mode call cursor(1, 1) --- 321,327 ---- \ "\", 'Lx!') call assert_equal(['123abc456789', '123456789'], \ getline(1, '$'), msg) ! call assert_equal([1, 6], [line('.'), col('.')], msg) " Middle-click in replace mode call cursor(1, 1) *************** *** 318,324 **** \ "\", 'Lx!') call assert_equal(['123abc45678abc', '123456789'], \ getline(1, '$'), msg) ! call assert_equal([1, 14], [line('.'), col('.')]) endfor let &mouse = save_mouse --- 330,336 ---- \ "\", 'Lx!') call assert_equal(['123abc45678abc', '123456789'], \ getline(1, '$'), msg) ! call assert_equal([1, 14], [line('.'), col('.')], msg) endfor let &mouse = save_mouse *************** *** 899,904 **** --- 911,963 ---- call assert_equal("\", mode(), msg) norm! r4 call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg) + + " Double-click on a space character should visually select all the + " consecutive space characters. + %d + call setline(1, ' one two') + call MouseLeftClick(1, 2) + call MouseLeftRelease(1, 2) + call MouseLeftClick(1, 2) + call MouseLeftRelease(1, 2) + call assert_equal('v', mode(), msg) + norm! r1 + call assert_equal(['1111one two'], getline(1, '$'), msg) + + " Double-click on a word with exclusive selection + set selection=exclusive + let @" = '' + call MouseLeftClick(1, 10) + call MouseLeftRelease(1, 10) + call MouseLeftClick(1, 10) + call MouseLeftRelease(1, 10) + norm! y + call assert_equal('two', @", msg) + + " Double click to select a block of text with exclusive selection + %d + call setline(1, 'one (two) three') + call MouseLeftClick(1, 5) + call MouseLeftRelease(1, 5) + call MouseLeftClick(1, 5) + call MouseLeftRelease(1, 5) + norm! y + call assert_equal(5, col("'<"), msg) + call assert_equal(10, col("'>"), msg) + + call MouseLeftClick(1, 9) + call MouseLeftRelease(1, 9) + call MouseLeftClick(1, 9) + call MouseLeftRelease(1, 9) + norm! y + call assert_equal(5, col("'<"), msg) + call assert_equal(10, col("'>"), msg) + set selection& + + " Click somewhere else so that the clicks above is not combined with the + " clicks in the next iteration. + call MouseRightClick(3, 10) + call MouseRightRelease(3, 10) endfor let &mouse = save_mouse *************** *** 909,914 **** --- 968,1008 ---- bwipe! endfunc + " Test for selecting text in visual blockwise mode using Alt-LeftClick + func Test_mouse_alt_leftclick() + let save_mouse = &mouse + let save_term = &term + let save_ttymouse = &ttymouse + call test_override('no_query_mouse', 1) + set mouse=a term=xterm mousetime=200 + set mousemodel=popup + new + call setline(1, 'one (two) three') + + for ttymouse_val in g:Ttymouse_values + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + " Left click with the Alt modifier key should extend the selection in + " blockwise visual mode. + let @" = '' + call MouseLeftClick(1, 3) + call MouseLeftRelease(1, 3) + call MouseAltLeftClick(1, 11) + call MouseLeftRelease(1, 11) + call assert_equal("\", mode(), msg) + normal! y + call assert_equal('e (two) t', @") + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& mousemodel& + call test_override('no_query_mouse', 0) + close! + endfunc + func Test_xterm_mouse_click_in_fold_columns() new let save_mouse = &mouse *************** *** 1086,1098 **** call assert_equal('three four', @") call assert_equal(9, col('.')) ! " Multi-line selection. Right click in the middle of thse selection ! call setline(1, ["one", "two", "three", "four", "five", "six"]) call test_setmouse(3, 1) exe "normal ggVG\y" call assert_equal(3, line("'<")) ! call test_setmouse(4, 1) exe "normal ggVG\y" call assert_equal(4, line("'>")) set mousemodel& --- 1180,1216 ---- call assert_equal('three four', @") call assert_equal(9, col('.')) ! " Right click inside the selection closer to the start of the selection ! call test_setmouse(1, 7) ! exe "normal 5|vee\lly" ! call assert_equal('three', @") ! call assert_equal(9, col('.')) ! call assert_equal(9, col("'<")) ! call assert_equal(13, col("'>")) ! ! " Right click inside the selection closer to the end of the selection ! call test_setmouse(1, 11) ! exe "normal 5|vee\ly" ! call assert_equal('two thre', @") ! call assert_equal(5, col('.')) ! call assert_equal(5, col("'<")) ! call assert_equal(12, col("'>")) ! ! " Multi-line selection. Right click inside thse selection. ! call setline(1, repeat(['aaaaaa'], 7)) call test_setmouse(3, 1) exe "normal ggVG\y" call assert_equal(3, line("'<")) ! call test_setmouse(5, 1) exe "normal ggVG\y" + call assert_equal(5, line("'>")) + + " Click right in the middle line of the selection + call test_setmouse(4, 3) + exe "normal ggVG$\y" + call assert_equal(4, line("'<")) + call test_setmouse(4, 4) + exe "normal ggVG$\y" call assert_equal(4, line("'>")) set mousemodel& *************** *** 1120,1130 **** menu PopUp.baz :let g:menustr = 'baz' for ttymouse_val in g:Ttymouse_values exe 'set ttymouse=' .. ttymouse_val let g:menustr = '' call feedkeys(MouseRightClickCode(1, 4) \ .. MouseRightReleaseCode(1, 4) .. "\\\", "x") ! call assert_equal('bar', g:menustr) endfor unmenu PopUp --- 1238,1249 ---- menu PopUp.baz :let g:menustr = 'baz' for ttymouse_val in g:Ttymouse_values + let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val let g:menustr = '' call feedkeys(MouseRightClickCode(1, 4) \ .. MouseRightReleaseCode(1, 4) .. "\\\", "x") ! call assert_equal('bar', g:menustr, msg) endfor unmenu PopUp *************** *** 1158,1227 **** vmenu PopUp.baz y:let g:menustr = 'baz' for ttymouse_val in g:Ttymouse_values exe 'set ttymouse=' .. ttymouse_val let g:menustr = '' call cursor(1, 1) call feedkeys(MouseRightClickCode(1, 5) \ .. MouseRightReleaseCode(1, 5) .. "\\\", "x") ! call assert_equal('bar', g:menustr) ! call assert_equal([1, 5], [line('.'), col('.')]) " Test for right click in visual mode inside the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 12) \ .. MouseRightReleaseCode(1, 12) .. "\\", "x") ! call assert_equal([1, 10], [line('.'), col('.')]) ! call assert_equal('ran away', @") " Test for right click in visual mode before the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 2) \ .. MouseRightReleaseCode(1, 2) .. "\\", "x") ! call assert_equal([1, 2], [line('.'), col('.')]) ! call assert_equal('', @") " Test for right click in visual mode after the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 20) \ .. MouseRightReleaseCode(1, 20) .. "\\", "x") ! call assert_equal([1, 20], [line('.'), col('.')]) ! call assert_equal('', @") " Test for right click in block-wise visual mode inside the selection let @" = '' call cursor(1, 16) call feedkeys("\j3l" .. MouseRightClickCode(2, 17) \ .. MouseRightReleaseCode(2, 17) .. "\\", "x") ! call assert_equal([1, 16], [line('.'), col('.')]) ! call assert_equal("\4", getregtype('"')) " Test for right click in block-wise visual mode outside the selection let @" = '' call cursor(1, 16) call feedkeys("\j3l" .. MouseRightClickCode(2, 2) \ .. MouseRightReleaseCode(2, 2) .. "\\", "x") ! call assert_equal([2, 2], [line('.'), col('.')]) ! call assert_equal('v', getregtype('"')) ! call assert_equal('', @") " Try clicking on the status line let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(6, 2) \ .. MouseRightReleaseCode(6, 2) .. "\\", "x") ! call assert_equal([1, 10], [line('.'), col('.')]) ! call assert_equal('ran away', @") " Try clicking outside the window let @" = '' call cursor(7, 2) call feedkeys('vee' .. MouseRightClickCode(7, 2) \ .. MouseRightReleaseCode(7, 2) .. "\\", "x") ! call assert_equal(2, winnr()) ! call assert_equal('', @") wincmd w endfor --- 1277,1347 ---- vmenu PopUp.baz y:let g:menustr = 'baz' for ttymouse_val in g:Ttymouse_values + let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val let g:menustr = '' call cursor(1, 1) call feedkeys(MouseRightClickCode(1, 5) \ .. MouseRightReleaseCode(1, 5) .. "\\\", "x") ! call assert_equal('bar', g:menustr, msg) ! call assert_equal([1, 5], [line('.'), col('.')], msg) " Test for right click in visual mode inside the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 12) \ .. MouseRightReleaseCode(1, 12) .. "\\", "x") ! call assert_equal([1, 10], [line('.'), col('.')], msg) ! call assert_equal('ran away', @", msg) " Test for right click in visual mode before the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 2) \ .. MouseRightReleaseCode(1, 2) .. "\\", "x") ! call assert_equal([1, 2], [line('.'), col('.')], msg) ! call assert_equal('', @", msg) " Test for right click in visual mode after the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 20) \ .. MouseRightReleaseCode(1, 20) .. "\\", "x") ! call assert_equal([1, 20], [line('.'), col('.')], msg) ! call assert_equal('', @", msg) " Test for right click in block-wise visual mode inside the selection let @" = '' call cursor(1, 16) call feedkeys("\j3l" .. MouseRightClickCode(2, 17) \ .. MouseRightReleaseCode(2, 17) .. "\\", "x") ! call assert_equal([1, 16], [line('.'), col('.')], msg) ! call assert_equal("\4", getregtype('"'), msg) " Test for right click in block-wise visual mode outside the selection let @" = '' call cursor(1, 16) call feedkeys("\j3l" .. MouseRightClickCode(2, 2) \ .. MouseRightReleaseCode(2, 2) .. "\\", "x") ! call assert_equal([2, 2], [line('.'), col('.')], msg) ! call assert_equal('v', getregtype('"'), msg) ! call assert_equal('', @", msg) " Try clicking on the status line let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(6, 2) \ .. MouseRightReleaseCode(6, 2) .. "\\", "x") ! call assert_equal([1, 10], [line('.'), col('.')], msg) ! call assert_equal('ran away', @", msg) " Try clicking outside the window let @" = '' call cursor(7, 2) call feedkeys('vee' .. MouseRightClickCode(7, 2) \ .. MouseRightReleaseCode(7, 2) .. "\\", "x") ! call assert_equal(2, winnr(), msg) ! call assert_equal('', @", msg) wincmd w endfor *************** *** 1303,1308 **** --- 1423,1533 ---- call test_override('no_query_mouse', 0) endfunc + " Test for the 'h' flag in the 'mouse' option. Using mouse in the help window. + func Test_term_mouse_help_window() + let save_mouse = &mouse + let save_term = &term + let save_ttymouse = &ttymouse + call test_override('no_query_mouse', 1) + set mouse=h term=xterm mousetime=200 + + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + help + let @" = '' + call MouseLeftClick(2, 5) + call MouseLeftRelease(2, 5) + call MouseLeftClick(1, 1) + call MouseLeftDrag(1, 10) + call MouseLeftRelease(1, 10) + norm! y + call assert_equal('*help.txt*', @", msg) + helpclose + + " Click somewhere else to make sure the left click above is not combined + " with the next left click and treated as a double click + call MouseRightClick(5, 10) + call MouseRightRelease(5, 10) + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + call test_override('no_query_mouse', 0) + %bw! + endfunc + + " Test for the translation of various mouse terminal codes + func Test_mouse_termcodes() + let save_mouse = &mouse + let save_term = &term + let save_ttymouse = &ttymouse + call test_override('no_query_mouse', 1) + set mouse=a term=xterm mousetime=200 + + new + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + let mouse_codes = [ + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\<2-LeftMouse>", "<2-LeftMouse>"], + \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"], + \ ["\<2-RightMouse>", "<2-RightMouse>"], + \ ["\<3-LeftMouse>", "<3-LeftMouse>"], + \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"], + \ ["\<3-RightMouse>", "<3-RightMouse>"], + \ ["\<4-LeftMouse>", "<4-LeftMouse>"], + \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"], + \ ["\<4-RightMouse>", "<4-RightMouse>"], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""] + \ ] + + for [code, outstr] in mouse_codes + exe "normal ggC\" . code + call assert_equal(outstr, getline(1), msg) + endfor + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + call test_override('no_query_mouse', 0) + %bw! + endfunc + " This only checks if the sequence is recognized. func Test_term_rgb_response() set t_RF=x *** ../vim-8.2.1234/src/version.c 2020-07-18 12:50:29.493696710 +0200 --- src/version.c 2020-07-18 12:58:19.104230178 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1235, /**/ -- Know this story about a nerd who fell into a river and drowned, despite his cries of "F1! F1!"? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///