To: vim_dev@googlegroups.com Subject: Patch 8.2.0425 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0425 Problem: Code for modeless selection not sufficiently tested. Solution: Add tests. Move mouse code functionality to a common script file. (Yegappan Lakshmanan, closes #5821) Files: src/testdir/Make_all.mak, src/testdir/gen_opt_test.vim, src/testdir/mouse.vim, src/testdir/test_edit.vim, src/testdir/test_global.vim, src/testdir/test_modeless.vim, src/testdir/test_normal.vim, src/testdir/test_selectmode.vim, src/testdir/test_termcodes.vim, src/testdir/test_visual.vim, src/ui.c *** ../vim-8.2.0424/src/testdir/Make_all.mak 2020-03-19 18:46:53.956641477 +0100 --- src/testdir/Make_all.mak 2020-03-22 14:01:32.438650833 +0100 *************** *** 180,185 **** --- 180,186 ---- test_method \ test_mksession \ test_mksession_utf8 \ + test_modeless \ test_modeline \ test_move \ test_nested_function \ *************** *** 222,227 **** --- 223,229 ---- test_search \ test_search_stat \ test_searchpos \ + test_selectmode \ test_set \ test_sha256 \ test_shift \ *************** *** 406,411 **** --- 408,414 ---- test_messages.res \ test_method.res \ test_mksession.res \ + test_modeless.res \ test_modeline.res \ test_nested_function.res \ test_netbeans.res \ *************** *** 440,445 **** --- 443,449 ---- test_scrollbind.res \ test_search.res \ test_search_stat.res \ + test_selectmode.res \ test_shortpathname.res \ test_signals.res \ test_signs.res \ *** ../vim-8.2.0424/src/testdir/gen_opt_test.vim 2020-03-02 20:54:19.319757505 +0100 --- src/testdir/gen_opt_test.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 73,79 **** \ 'buftype': [['', 'help', 'nofile'], ['xxx', 'help,nofile']], \ 'casemap': [['', 'internal'], ['xxx']], \ 'cedit': [['', '\'], ['xxx', 'f']], ! \ 'clipboard': [['', 'unnamed', 'autoselect,unnamed'], ['xxx']], \ 'colorcolumn': [['', '8', '+2'], ['xxx']], \ 'comments': [['', 'b:#'], ['xxx']], \ 'commentstring': [['', '/*%s*/'], ['xxx']], --- 73,79 ---- \ 'buftype': [['', 'help', 'nofile'], ['xxx', 'help,nofile']], \ 'casemap': [['', 'internal'], ['xxx']], \ 'cedit': [['', '\'], ['xxx', 'f']], ! \ 'clipboard': [['', 'unnamed', 'autoselect,unnamed', 'html', 'exclude:vimdisplay'], ['xxx', '\ze*']], \ 'colorcolumn': [['', '8', '+2'], ['xxx']], \ 'comments': [['', 'b:#'], ['xxx']], \ 'commentstring': [['', '/*%s*/'], ['xxx']], *** ../vim-8.2.0424/src/testdir/mouse.vim 2020-03-22 14:06:50.405552433 +0100 --- src/testdir/mouse.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 0 **** --- 1,172 ---- + " Helper functions for generating mouse events + + " xterm2 and sgr always work, urxvt is optional. + let g:Ttymouse_values = ['xterm2', 'sgr'] + if has('mouse_urxvt') + call add(g:Ttymouse_values, 'urxvt') + endif + + " dec doesn't support all the functionality + if has('mouse_dec') + let g:Ttymouse_dec = ['dec'] + else + let g:Ttymouse_dec = [] + endif + + " netterm only supports left click + if has('mouse_netterm') + let g:Ttymouse_netterm = ['netterm'] + else + let g:Ttymouse_netterm = [] + endif + + " Helper function to emit a terminal escape code. + func TerminalEscapeCode(code, row, col, m) + if &ttymouse ==# 'xterm2' + " need to use byte encoding here. + let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20]) + if has('iconv') + let bytes = str->iconv('utf-8', 'latin1') + else + " Hopefully the numbers are not too big. + let bytes = str + endif + return "\[M" .. bytes + elseif &ttymouse ==# 'sgr' + return printf("\[<%d;%d;%d%s", a:code, a:col, a:row, a:m) + elseif &ttymouse ==# 'urxvt' + return printf("\[%d;%d;%dM", a:code + 0x20, a:col, a:row) + endif + endfunc + + func DecEscapeCode(code, down, row, col) + return printf("\[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col) + endfunc + + func NettermEscapeCode(row, col) + return printf("\}%d,%d\r", a:row, a:col) + endfunc + + func MouseLeftClickCode(row, col) + if &ttymouse ==# 'dec' + return DecEscapeCode(2, 4, a:row, a:col) + elseif &ttymouse ==# 'netterm' + return NettermEscapeCode(a:row, a:col) + else + return TerminalEscapeCode(0, a:row, a:col, 'M') + endif + endfunc + + func MouseLeftClick(row, col) + call feedkeys(MouseLeftClickCode(a:row, a:col), 'Lx!') + endfunc + + func MouseMiddleClickCode(row, col) + if &ttymouse ==# 'dec' + return DecEscapeCode(4, 2, a:row, a:col) + else + return TerminalEscapeCode(1, a:row, a:col, 'M') + endif + endfunc + + func MouseMiddleClick(row, col) + call feedkeys(MouseMiddleClickCode(a:row, a:col), 'Lx!') + endfunc + + func MouseRightClickCode(row, col) + if &ttymouse ==# 'dec' + return DecEscapeCode(6, 1, a:row, a:col) + else + return TerminalEscapeCode(2, a:row, a:col, 'M') + endif + endfunc + + func MouseRightClick(row, col) + call feedkeys(MouseRightClickCode(a:row, a:col), 'Lx!') + endfunc + + func MouseCtrlLeftClickCode(row, col) + let ctrl = 0x10 + return TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M') + endfunc + + func MouseCtrlLeftClick(row, col) + call feedkeys(MouseCtrlLeftClickCode(a:row, a:col), 'Lx!') + endfunc + + func MouseCtrlRightClickCode(row, col) + let ctrl = 0x10 + return TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M') + endfunc + + func MouseCtrlRightClick(row, col) + call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!') + endfunc + + func MouseLeftReleaseCode(row, col) + if &ttymouse ==# 'dec' + return DecEscapeCode(3, 0, a:row, a:col) + elseif &ttymouse ==# 'netterm' + return '' + else + return TerminalEscapeCode(3, a:row, a:col, 'm') + endif + endfunc + + func MouseLeftRelease(row, col) + call feedkeys(MouseLeftReleaseCode(a:row, a:col), 'Lx!') + endfunc + + func MouseMiddleReleaseCode(row, col) + if &ttymouse ==# 'dec' + return DecEscapeCode(5, 0, a:row, a:col) + else + return TerminalEscapeCode(3, a:row, a:col, 'm') + endif + endfunc + + func MouseMiddleRelease(row, col) + call feedkeys(MouseMiddleReleaseCode(a:row, a:col), 'Lx!') + endfunc + + func MouseRightReleaseCode(row, col) + if &ttymouse ==# 'dec' + return DecEscapeCode(7, 0, a:row, a:col) + else + return TerminalEscapeCode(3, a:row, a:col, 'm') + endif + endfunc + + func MouseRightRelease(row, col) + call feedkeys(MouseRightReleaseCode(a:row, a:col), 'Lx!') + endfunc + + func MouseLeftDragCode(row, col) + if &ttymouse ==# 'dec' + return DecEscapeCode(1, 4, a:row, a:col) + else + return TerminalEscapeCode(0x20, a:row, a:col, 'M') + endif + endfunc + + func MouseLeftDrag(row, col) + call feedkeys(MouseLeftDragCode(a:row, a:col), 'Lx!') + endfunc + + func MouseWheelUpCode(row, col) + return TerminalEscapeCode(0x40, a:row, a:col, 'M') + endfunc + + func MouseWheelUp(row, col) + call feedkeys(MouseWheelUpCode(a:row, a:col), 'Lx!') + endfunc + + func MouseWheelDownCode(row, col) + return TerminalEscapeCode(0x41, a:row, a:col, 'M') + endfunc + + func MouseWheelDown(row, col) + call feedkeys(MouseWheelDownCode(a:row, a:col), 'Lx!') + endfunc + + " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.0424/src/testdir/test_edit.vim 2020-03-10 07:48:06.571619551 +0100 --- src/testdir/test_edit.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 257,278 **** bw! endfunc - func Test_edit_10() - " Test for starting selectmode - new - set selectmode=key keymodel=startsel - call setline(1, ['abc', 'def', 'ghi']) - call cursor(1, 4) - call feedkeys("A\start\", 'txin') - call assert_equal(['startdef', 'ghi'], getline(1, '$')) - " start select mode again with gv - set selectmode=cmd - call feedkeys('gvabc', 'xt') - call assert_equal('abctdef', getline(1)) - set selectmode= keymodel= - bw! - endfunc - func Test_edit_11() " Test that indenting kicks in new --- 257,262 ---- *** ../vim-8.2.0424/src/testdir/test_global.vim 2020-02-21 17:54:41.830235712 +0100 --- src/testdir/test_global.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 5,11 **** set clipboard=unnamed g/^/normal yyp call assert_equal(['a', 'a', 'b', 'b', 'c', 'c'], getline(1, 6)) ! set clipboard& bwipe! endfunc --- 5,14 ---- set clipboard=unnamed g/^/normal yyp call assert_equal(['a', 'a', 'b', 'b', 'c', 'c'], getline(1, 6)) ! set clipboard=unnamed,unnamedplus ! call setline(1, ['a', 'b', 'c']) ! g/^/normal yyp ! call assert_equal(['a', 'a', 'b', 'b', 'c', 'c'], getline(1, 6)) set clipboard& bwipe! endfunc *** ../vim-8.2.0424/src/testdir/test_modeless.vim 2020-03-22 14:06:50.417552417 +0100 --- src/testdir/test_modeless.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 0 **** --- 1,397 ---- + " Test for modeless selection + + " This only works for Unix in a terminal + source check.vim + CheckNotGui + CheckUnix + + source mouse.vim + + " Test for modeless characterwise selection (single click) + func Test_modeless_characterwise_selection() + CheckFeature clipboard_working + 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 + call setline(1, ['one two three', 'foo bar baz']) + redraw! + + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + " select multiple characters within a line + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 6) + let keys ..= MouseLeftDragCode(1, 10) + let keys ..= MouseLeftReleaseCode(1, 10) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("wo th", @*, msg) + + " select multiple characters including the end of line + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 11) + let keys ..= MouseLeftDragCode(1, 16) + let keys ..= MouseLeftReleaseCode(1, 16) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("ree\n", @*, msg) + + " extend a selection using right mouse click + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + set mousemodel=extend + let keys = ":" + let keys ..= MouseLeftClickCode(1, 2) + let keys ..= MouseLeftDragCode(1, 5) + let keys ..= MouseLeftReleaseCode(1, 5) + let keys ..= MouseRightClickCode(1, 10) + let keys ..= MouseRightReleaseCode(1, 10) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("ne two th", @*, msg) + set mousemodel& + + " extend a selection backwards using right mouse click + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + set mousemodel=extend + let keys = ":" + let keys ..= MouseLeftClickCode(1, 7) + let keys ..= MouseLeftDragCode(1, 11) + let keys ..= MouseLeftReleaseCode(1, 11) + let keys ..= MouseRightClickCode(1, 3) + let keys ..= MouseRightReleaseCode(1, 3) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("e two thr", @*, msg) + set mousemodel& + + " select multiple characters within a line backwards + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 9) + let keys ..= MouseLeftDragCode(1, 3) + let keys ..= MouseLeftReleaseCode(1, 3) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("e two t", @*, msg) + + " select multiple characters across lines with (end row > start row) and + " (end column < start column) + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 9) + let keys ..= MouseLeftDragCode(2, 3) + let keys ..= MouseLeftReleaseCode(2, 3) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("three\nfoo", @*, msg) + + " select multiple characters across lines with (end row > start row) and + " (end column > start column) + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 4) + let keys ..= MouseLeftDragCode(2, 8) + let keys ..= MouseLeftReleaseCode(2, 8) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal(" two three\nfoo bar ", @*, msg) + + " select multiple characters across lines with (end row < start row) and + " (end column < start column) + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 7) + let keys ..= MouseLeftDragCode(1, 5) + let keys ..= MouseLeftReleaseCode(1, 5) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("two three\nfoo bar", @*, msg) + + " select multiple characters across lines with (end row < start row) and + " (end column > start column) + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 11) + let keys ..= MouseLeftDragCode(1, 13) + let keys ..= MouseLeftReleaseCode(1, 13) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("e\nfoo bar baz", @*, msg) + + " select multiple characters across lines with (end row < start row) and + " the end column is greater than the line length + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 7) + let keys ..= MouseLeftDragCode(1, 16) + let keys ..= MouseLeftReleaseCode(1, 16) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("\nfoo bar", @*, msg) + + " select multiple characters across lines with start/end row and start/end + " column outside the lines in the buffer + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(4, 3) + let keys ..= MouseLeftDragCode(3, 2) + let keys ..= MouseLeftReleaseCode(3, 2) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("\n~ ", @*, msg) + + " change selection using right mouse click within the selected text + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + set mousemodel=extend + let keys = ":" + let keys ..= MouseLeftClickCode(1, 5) + let keys ..= MouseLeftDragCode(1, 13) + let keys ..= MouseLeftReleaseCode(1, 13) + let keys ..= MouseRightClickCode(1, 7) + let keys ..= MouseRightReleaseCode(1, 7) + let keys ..= MouseRightClickCode(1, 11) + let keys ..= MouseRightReleaseCode(1, 11) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("o thr", @*, msg) + set mousemodel& + + " select text multiple times at different places + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 3) + let keys ..= MouseLeftDragCode(1, 5) + let keys ..= MouseLeftReleaseCode(1, 5) + let keys ..= MouseLeftClickCode(2, 7) + let keys ..= MouseLeftDragCode(2, 9) + let keys ..= MouseLeftReleaseCode(2, 9) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("r b", @*, msg) + + " Test for 'clipboard' set to 'autoselectml' to automatically copy the + " modeless selection to the clipboard + set clipboard=autoselectml + let @* = '' + let keys = ":" + let keys ..= MouseLeftClickCode(2, 5) + let keys ..= MouseLeftDragCode(2, 7) + let keys ..= MouseLeftReleaseCode(2, 7) + let keys ..= "\" + call feedkeys(keys, "x") + call assert_equal("bar", @*) + set clipboard& + + " quadruple click should start characterwise selectmode + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 10) + let keys ..= MouseLeftReleaseCode(1, 10) + let keys ..= MouseLeftClickCode(1, 10) + let keys ..= MouseLeftReleaseCode(1, 10) + let keys ..= MouseLeftClickCode(1, 10) + let keys ..= MouseLeftReleaseCode(1, 10) + let keys ..= MouseLeftClickCode(1, 10) + let keys ..= MouseLeftDragCode(1, 11) + let keys ..= MouseLeftReleaseCode(1, 11) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("hree", @*, msg) + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + call test_override('no_query_mouse', 0) + close! + endfunc + + " Test for modeless word selection (double click) + func Test_modeless_word_selection() + CheckFeature clipboard_working + 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 + call setline(1, ['one two three', 'foo bar baz']) + redraw! + + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + " select multiple words within a line + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 6) + let keys ..= MouseLeftReleaseCode(1, 6) + let keys ..= MouseLeftClickCode(1, 6) + let keys ..= MouseLeftDragCode(1, 10) + let keys ..= MouseLeftReleaseCode(1, 10) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("two three", @*, msg) + + " select a single word + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 6) + let keys ..= MouseLeftReleaseCode(2, 6) + let keys ..= MouseLeftClickCode(2, 6) + let keys ..= MouseLeftReleaseCode(2, 6) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("bar", @*, msg) + + " select multiple words backwards within a line + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 11) + let keys ..= MouseLeftReleaseCode(2, 11) + let keys ..= MouseLeftClickCode(2, 11) + let keys ..= MouseLeftDragCode(2, 7) + let keys ..= MouseLeftReleaseCode(2, 7) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("bar baz", @*, msg) + + " select multiple words backwards across lines + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 7) + let keys ..= MouseLeftReleaseCode(2, 7) + let keys ..= MouseLeftClickCode(2, 7) + let keys ..= MouseLeftDragCode(1, 6) + let keys ..= MouseLeftReleaseCode(1, 6) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("two three\nfoo bar", @*, msg) + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + call test_override('no_query_mouse', 0) + close! + endfunc + + " Test for modeless line selection (triple click) + func Test_modeless_line_selection() + CheckFeature clipboard_working + 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 + call setline(1, ['one two three', 'foo bar baz']) + redraw! + + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + " select single line + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 6) + let keys ..= MouseLeftReleaseCode(2, 6) + let keys ..= MouseLeftClickCode(2, 6) + let keys ..= MouseLeftReleaseCode(2, 6) + let keys ..= MouseLeftClickCode(2, 6) + let keys ..= MouseLeftReleaseCode(2, 6) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("foo bar baz\n", @*, msg) + + " select multiple lines + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(1, 6) + let keys ..= MouseLeftReleaseCode(1, 6) + let keys ..= MouseLeftClickCode(1, 6) + let keys ..= MouseLeftReleaseCode(1, 6) + let keys ..= MouseLeftClickCode(1, 6) + let keys ..= MouseLeftDragCode(2, 12) + let keys ..= MouseLeftReleaseCode(2, 12) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("one two three\nfoo bar baz\n", @*, msg) + + " select multiple lines backwards + let @* = '' + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + let keys = ":" + let keys ..= MouseLeftClickCode(2, 10) + let keys ..= MouseLeftReleaseCode(2, 10) + let keys ..= MouseLeftClickCode(2, 10) + let keys ..= MouseLeftReleaseCode(2, 10) + let keys ..= MouseLeftClickCode(2, 10) + let keys ..= MouseLeftDragCode(1, 3) + let keys ..= MouseLeftReleaseCode(1, 3) + let keys ..= "\\" + call feedkeys(keys, "x") + call assert_equal("one two three\nfoo bar baz\n", @*, msg) + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + call test_override('no_query_mouse', 0) + close! + endfunc + + " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.0424/src/testdir/test_normal.vim 2020-03-20 18:20:47.080975621 +0100 --- src/testdir/test_normal.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 121,150 **** bw! endfunc - " Test for select mode - func Test_normal02_selectmode() - call Setup_NewWindow() - 50 - norm! gHy - call assert_equal('y51', getline('.')) - call setline(1, range(1,100)) - 50 - exe ":norm! V9jo\y" - call assert_equal('y60', getline('.')) - " clean up - bw! - endfunc - - func Test_normal02_selectmode2() - " some basic select mode tests - call Setup_NewWindow() - 50 - call feedkeys(":set im\n\gHc\:set noim\n", 'tx') - call assert_equal('c51', getline('.')) - " clean up - bw! - endfunc - func Test_normal03_join() " basic join test call Setup_NewWindow() --- 121,126 ---- *** ../vim-8.2.0424/src/testdir/test_selectmode.vim 2020-03-22 14:06:50.425552406 +0100 --- src/testdir/test_selectmode.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 0 **** --- 1,255 ---- + " Test for Select-mode + + " This only works for Unix in a terminal + source check.vim + CheckNotGui + CheckUnix + + source mouse.vim + + " Test for select mode + func Test_selectmode_basic() + new + call setline(1, range(1,100)) + 50 + norm! gHy + call assert_equal('y51', getline('.')) + call setline(1, range(1,100)) + 50 + exe ":norm! V9jo\y" + call assert_equal('y60', getline('.')) + call setline(1, range(1,100)) + 50 + call feedkeys(":set im\n\gHc\:set noim\n", 'tx') + call assert_equal('c51', getline('.')) + " clean up + bw! + endfunc + + " Test for starting selectmode + func Test_selectmode_start() + new + set selectmode=key keymodel=startsel + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 4) + call feedkeys("A\start\", 'txin') + call assert_equal(['startdef', 'ghi'], getline(1, '$')) + " start select mode again with gv + set selectmode=cmd + call feedkeys('gvabc', 'xt') + call assert_equal('abctdef', getline(1)) + set selectmode= keymodel= + bw! + endfunc + + " Test for characterwise select mode + func Test_characterwise_select_mode() + new + + " Select mode maps + snoremap End> + snoremap Down> + snoremap Del> + + " characterwise select mode: delete middle line + call deletebufline('', 1, '$') + call append('$', ['a', 'b', 'c']) + exe "normal Gkkgh\\" + call assert_equal(['', 'b', 'c'], getline(1, '$')) + + " characterwise select mode: delete middle two lines + call deletebufline('', 1, '$') + call append('$', ['a', 'b', 'c']) + exe "normal Gkkgh\\\" + call assert_equal(['', 'c'], getline(1, '$')) + + " characterwise select mode: delete last line + call deletebufline('', 1, '$') + call append('$', ['a', 'b', 'c']) + exe "normal Ggh\\" + call assert_equal(['', 'a', 'b', ''], getline(1, '$')) + + " characterwise select mode: delete last two lines + call deletebufline('', 1, '$') + call append('$', ['a', 'b', 'c']) + exe "normal Gkgh\\\" + call assert_equal(['', 'a', ''], getline(1, '$')) + + " CTRL-H in select mode behaves like 'x' + call setline(1, 'abcdef') + exe "normal! gggh\\\\" + call assert_equal('ef', getline(1)) + + " CTRL-O in select mode switches to visual mode for one command + call setline(1, 'abcdef') + exe "normal! gggh\3lm" + call assert_equal('mef', getline(1)) + + sunmap End> + sunmap Down> + sunmap Del> + bwipe! + endfunc + + " Test for linewise select mode + func Test_linewise_select_mode() + new + + " linewise select mode: delete middle line + call append('$', ['a', 'b', 'c']) + exe "normal GkkgH\" + call assert_equal(['', 'b', 'c'], getline(1, '$')) + + " linewise select mode: delete middle two lines + call deletebufline('', 1, '$') + call append('$', ['a', 'b', 'c']) + exe "normal GkkgH\\" + call assert_equal(['', 'c'], getline(1, '$')) + + " linewise select mode: delete last line + call deletebufline('', 1, '$') + call append('$', ['a', 'b', 'c']) + exe "normal GgH\" + call assert_equal(['', 'a', 'b'], getline(1, '$')) + + " linewise select mode: delete last two lines + call deletebufline('', 1, '$') + call append('$', ['a', 'b', 'c']) + exe "normal GkgH\\" + call assert_equal(['', 'a'], getline(1, '$')) + + bwipe! + endfunc + + " Test for blockwise select mode (g CTRL-H) + func Test_blockwise_select_mode() + new + call setline(1, ['foo', 'bar']) + call feedkeys("g\\\mm", 'xt') + call assert_equal(['mmo', 'mmr'], getline(1, '$')) + close! + endfunc + + " Test for using visual mode maps in select mode + func Test_select_mode_map() + new + vmap 3l + call setline(1, 'Test line') + call feedkeys("gh\map", 'xt') + call assert_equal('map line', getline(1)) + + vmap ygV + call feedkeys("0gh\\\cwabc", 'xt') + call assert_equal('abc line', getline(1)) + + vmap :let v=100 + call feedkeys("gggh\\\foo", 'xt') + call assert_equal('foo line', getline(1)) + + " reselect the select mode using gv from a visual mode map + vmap gv + set selectmode=cmd + call feedkeys("0gh\map", 'xt') + call assert_equal('map line', getline(1)) + set selectmode& + + close! + endfunc + + " Test double/triple/quadruple click to start 'select' mode + func Test_term_mouse_multiple_clicks_to_select_mode() + 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 selectmode=mouse + new + + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + " Single-click and drag should 'select' the characters + call setline(1, ['foo [foo bar] foo', 'foo']) + call MouseLeftClick(1, 3) + call assert_equal(0, getcharmod(), msg) + call MouseLeftDrag(1, 13) + call MouseLeftRelease(1, 13) + norm! o + call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg) + + " Double-click on word should visually 'select' the word. + call setline(1, ['foo [foo bar] foo', 'foo']) + call MouseLeftClick(1, 2) + call assert_equal(0, getcharmod(), msg) + call MouseLeftRelease(1, 2) + call MouseLeftClick(1, 2) + call assert_equal(32, getcharmod(), msg) " double-click + call MouseLeftRelease(1, 2) + call assert_equal('s', mode(), msg) + norm! bar + call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg) + + " Double-click on opening square bracket should visually + " 'select' the whole [foo bar]. + call setline(1, ['foo [foo bar] foo', 'foo']) + call MouseLeftClick(1, 5) + call assert_equal(0, getcharmod(), msg) + call MouseLeftRelease(1, 5) + call MouseLeftClick(1, 5) + call assert_equal(32, getcharmod(), msg) " double-click + call MouseLeftRelease(1, 5) + call assert_equal('s', mode(), msg) + norm! bar + call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg) + + " To guarantee that the next click is not counted as a triple click + call MouseRightClick(1, 1) + call MouseRightRelease(1, 1) + + " Triple-click should visually 'select' the whole line. + call setline(1, ['foo [foo bar] foo', 'foo']) + call MouseLeftClick(1, 3) + call assert_equal(0, getcharmod(), msg) + call MouseLeftRelease(1, 3) + call MouseLeftClick(1, 3) + call assert_equal(32, getcharmod(), msg) " double-click + call MouseLeftRelease(1, 3) + call MouseLeftClick(1, 3) + call assert_equal(64, getcharmod(), msg) " triple-click + call MouseLeftRelease(1, 3) + call assert_equal('S', mode(), msg) + norm! baz + call assert_equal(['bazfoo'], getline(1, '$'), msg) + + " Quadruple-click should start visual block 'select'. + call setline(1, ['aaaaaa', 'bbbbbb']) + call MouseLeftClick(1, 2) + call assert_equal(0, getcharmod(), msg) + call MouseLeftRelease(1, 2) + call MouseLeftClick(1, 2) + call assert_equal(32, getcharmod(), msg) " double-click + call MouseLeftRelease(1, 2) + call MouseLeftClick(1, 2) + call assert_equal(64, getcharmod(), msg) " triple-click + call MouseLeftRelease(1, 2) + call MouseLeftClick(1, 2) + call assert_equal(96, getcharmod(), msg) " quadruple-click + call MouseLeftDrag(2, 4) + call MouseLeftRelease(2, 4) + call assert_equal("\", mode(), msg) + norm! x + call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg) + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + set selectmode& + call test_override('no_query_mouse', 0) + bwipe! + endfunc + + " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.0424/src/testdir/test_termcodes.vim 2020-03-15 16:12:16.552208654 +0100 --- src/testdir/test_termcodes.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 6,180 **** CheckUnix source shared.vim ! ! " xterm2 and sgr always work, urxvt is optional. ! let s:ttymouse_values = ['xterm2', 'sgr'] ! if has('mouse_urxvt') ! call add(s:ttymouse_values, 'urxvt') ! endif ! ! " dec doesn't support all the functionality ! if has('mouse_dec') ! let s:ttymouse_dec = ['dec'] ! else ! let s:ttymouse_dec = [] ! endif ! ! " netterm only supports left click ! if has('mouse_netterm') ! let s:ttymouse_netterm = ['netterm'] ! else ! let s:ttymouse_netterm = [] ! endif ! ! " Helper function to emit a terminal escape code. ! func TerminalEscapeCode(code, row, col, m) ! if &ttymouse ==# 'xterm2' ! " need to use byte encoding here. ! let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20]) ! if has('iconv') ! let bytes = str->iconv('utf-8', 'latin1') ! else ! " Hopefully the numbers are not too big. ! let bytes = str ! endif ! return "\[M" .. bytes ! elseif &ttymouse ==# 'sgr' ! return printf("\[<%d;%d;%d%s", a:code, a:col, a:row, a:m) ! elseif &ttymouse ==# 'urxvt' ! return printf("\[%d;%d;%dM", a:code + 0x20, a:col, a:row) ! endif ! endfunc ! ! func DecEscapeCode(code, down, row, col) ! return printf("\[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col) ! endfunc ! ! func NettermEscapeCode(row, col) ! return printf("\}%d,%d\r", a:row, a:col) ! endfunc ! ! func MouseLeftClickCode(row, col) ! if &ttymouse ==# 'dec' ! return DecEscapeCode(2, 4, a:row, a:col) ! elseif &ttymouse ==# 'netterm' ! return NettermEscapeCode(a:row, a:col) ! else ! return TerminalEscapeCode(0, a:row, a:col, 'M') ! endif ! endfunc ! ! func MouseLeftClick(row, col) ! call feedkeys(MouseLeftClickCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseMiddleClickCode(row, col) ! if &ttymouse ==# 'dec' ! return DecEscapeCode(4, 2, a:row, a:col) ! else ! return TerminalEscapeCode(1, a:row, a:col, 'M') ! endif ! endfunc ! ! func MouseMiddleClick(row, col) ! call feedkeys(MouseMiddleClickCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseRightClickCode(row, col) ! if &ttymouse ==# 'dec' ! return DecEscapeCode(6, 1, a:row, a:col) ! else ! return TerminalEscapeCode(2, a:row, a:col, 'M') ! endif ! endfunc ! ! func MouseRightClick(row, col) ! call feedkeys(MouseRightClickCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseCtrlLeftClickCode(row, col) ! let ctrl = 0x10 ! return TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M') ! endfunc ! ! func MouseCtrlLeftClick(row, col) ! call feedkeys(MouseCtrlLeftClickCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseCtrlRightClickCode(row, col) ! let ctrl = 0x10 ! return TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M') ! endfunc ! ! func MouseCtrlRightClick(row, col) ! call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseLeftReleaseCode(row, col) ! if &ttymouse ==# 'dec' ! return DecEscapeCode(3, 0, a:row, a:col) ! elseif &ttymouse ==# 'netterm' ! return '' ! else ! return TerminalEscapeCode(3, a:row, a:col, 'm') ! endif ! endfunc ! ! func MouseLeftRelease(row, col) ! call feedkeys(MouseLeftReleaseCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseMiddleReleaseCode(row, col) ! if &ttymouse ==# 'dec' ! return DecEscapeCode(5, 0, a:row, a:col) ! else ! return TerminalEscapeCode(3, a:row, a:col, 'm') ! endif ! endfunc ! ! func MouseMiddleRelease(row, col) ! call feedkeys(MouseMiddleReleaseCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseRightReleaseCode(row, col) ! if &ttymouse ==# 'dec' ! return DecEscapeCode(7, 0, a:row, a:col) ! else ! return TerminalEscapeCode(3, a:row, a:col, 'm') ! endif ! endfunc ! ! func MouseRightRelease(row, col) ! call feedkeys(MouseRightReleaseCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseLeftDragCode(row, col) ! if &ttymouse ==# 'dec' ! return DecEscapeCode(1, 4, a:row, a:col) ! else ! return TerminalEscapeCode(0x20, a:row, a:col, 'M') ! endif ! endfunc ! ! func MouseLeftDrag(row, col) ! call feedkeys(MouseLeftDragCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseWheelUpCode(row, col) ! return TerminalEscapeCode(0x40, a:row, a:col, 'M') ! endfunc ! ! func MouseWheelUp(row, col) ! call feedkeys(MouseWheelUpCode(a:row, a:col), 'Lx!') ! endfunc ! ! func MouseWheelDownCode(row, col) ! return TerminalEscapeCode(0x41, a:row, a:col, 'M') ! endfunc ! ! func MouseWheelDown(row, col) ! call feedkeys(MouseWheelDownCode(a:row, a:col), 'Lx!') ! endfunc func Test_term_mouse_left_click() new --- 6,12 ---- CheckUnix source shared.vim ! source mouse.vim func Test_term_mouse_left_click() new *************** *** 185,191 **** set mouse=a term=xterm call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer']) ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val go --- 17,23 ---- set mouse=a term=xterm call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer']) ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val go *************** *** 215,221 **** set mouse=a term=xterm for visual_mode in ["v", "V", "\"] ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val --- 47,53 ---- set mouse=a term=xterm for visual_mode in ["v", "V", "\"] ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val *************** *** 284,290 **** let save_ttymouse = &ttymouse set mouse=a term=xterm ! for ttymouse_val in s:ttymouse_values let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val help --- 116,122 ---- let save_ttymouse = &ttymouse set mouse=a term=xterm ! for ttymouse_val in g:Ttymouse_values let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val help *************** *** 322,328 **** let @* = 'abc' set mouse=a term=xterm ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val call setline(1, ['123456789', '123456789']) --- 154,160 ---- let @* = 'abc' set mouse=a term=xterm ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val call setline(1, ['123456789', '123456789']) *************** *** 366,372 **** set mouse=a term=xterm call setline(1, range(1, 100)) ! for ttymouse_val in s:ttymouse_values let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val go --- 198,204 ---- set mouse=a term=xterm call setline(1, range(1, 100)) ! for ttymouse_val in g:Ttymouse_values let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val go *************** *** 413,419 **** wincmd j 2split ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val --- 245,251 ---- wincmd j 2split ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val *************** *** 490,496 **** call test_override('no_query_mouse', 1) set mouse=a term=xterm ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val --- 322,328 ---- call test_override('no_query_mouse', 1) set mouse=a term=xterm ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val *************** *** 549,555 **** let save_laststatus = &laststatus set mouse=a term=xterm laststatus=2 ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val --- 381,387 ---- let save_laststatus = &laststatus set mouse=a term=xterm laststatus=2 ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val *************** *** 592,598 **** set mouse=a term=xterm let row = 1 ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val e Xfoo --- 424,430 ---- set mouse=a term=xterm let row = 1 ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val e Xfoo *************** *** 642,648 **** let row = 1 let col = &columns ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm if ttymouse_val ==# 'xterm2' && col > 223 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. continue --- 474,480 ---- let row = 1 let col = &columns ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm if ttymouse_val ==# 'xterm2' && col > 223 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. continue *************** *** 690,696 **** set mouse=a term=xterm mousetime=1 let row = 1 ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val e Xtab1 --- 522,528 ---- set mouse=a term=xterm mousetime=1 let row = 1 ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val e Xtab1 *************** *** 744,750 **** let row = 1 let col = 10 ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val e Xtab1 --- 576,582 ---- let row = 1 let col = 10 ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val e Xtab1 *************** *** 797,803 **** set mouse=a term=xterm mousetime=200 new ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val call setline(1, ['foo [foo bar] foo', 'foo']) --- 629,635 ---- set mouse=a term=xterm mousetime=200 new ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val call setline(1, ['foo [foo bar] foo', 'foo']) *************** *** 925,931 **** set mouse=a term=xterm let row = &lines ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val --- 757,763 ---- set mouse=a term=xterm let row = &lines ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val *************** *** 958,964 **** let col = 1 let @* = 'paste' ! for ttymouse_val in s:ttymouse_values + s:ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val --- 790,796 ---- let col = 1 let @* = 'paste' ! for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val *************** *** 995,1001 **** menu PopUp.bar :let g:menustr = 'bar' menu PopUp.baz :let g:menustr = 'baz' ! for ttymouse_val in s:ttymouse_values exe 'set ttymouse=' .. ttymouse_val let g:menustr = '' call feedkeys(MouseRightClickCode(1, 4) --- 827,833 ---- menu PopUp.bar :let g:menustr = 'bar' 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) *** ../vim-8.2.0424/src/testdir/test_visual.vim 2020-03-10 07:48:06.575619533 +0100 --- src/testdir/test_visual.vim 2020-03-22 14:01:32.438650833 +0100 *************** *** 618,709 **** bwipe! endfunc - func Test_characterwise_select_mode() - new - - " Select mode maps - snoremap End> - snoremap Down> - snoremap Del> - - " characterwise select mode: delete middle line - call deletebufline('', 1, '$') - call append('$', ['a', 'b', 'c']) - exe "normal Gkkgh\\" - call assert_equal(['', 'b', 'c'], getline(1, '$')) - - " characterwise select mode: delete middle two lines - call deletebufline('', 1, '$') - call append('$', ['a', 'b', 'c']) - exe "normal Gkkgh\\\" - call assert_equal(['', 'c'], getline(1, '$')) - - " characterwise select mode: delete last line - call deletebufline('', 1, '$') - call append('$', ['a', 'b', 'c']) - exe "normal Ggh\\" - call assert_equal(['', 'a', 'b', ''], getline(1, '$')) - - " characterwise select mode: delete last two lines - call deletebufline('', 1, '$') - call append('$', ['a', 'b', 'c']) - exe "normal Gkgh\\\" - call assert_equal(['', 'a', ''], getline(1, '$')) - - " CTRL-H in select mode behaves like 'x' - call setline(1, 'abcdef') - exe "normal! gggh\\\\" - call assert_equal('ef', getline(1)) - - " CTRL-O in select mode switches to visual mode for one command - call setline(1, 'abcdef') - exe "normal! gggh\3lm" - call assert_equal('mef', getline(1)) - - sunmap End> - sunmap Down> - sunmap Del> - bwipe! - endfunc - - func Test_linewise_select_mode() - new - - " linewise select mode: delete middle line - call append('$', ['a', 'b', 'c']) - exe "normal GkkgH\" - call assert_equal(['', 'b', 'c'], getline(1, '$')) - - " linewise select mode: delete middle two lines - call deletebufline('', 1, '$') - call append('$', ['a', 'b', 'c']) - exe "normal GkkgH\\" - call assert_equal(['', 'c'], getline(1, '$')) - - " linewise select mode: delete last line - call deletebufline('', 1, '$') - call append('$', ['a', 'b', 'c']) - exe "normal GgH\" - call assert_equal(['', 'a', 'b'], getline(1, '$')) - - " linewise select mode: delete last two lines - call deletebufline('', 1, '$') - call append('$', ['a', 'b', 'c']) - exe "normal GkgH\\" - call assert_equal(['', 'a'], getline(1, '$')) - - bwipe! - endfunc - - " Test for blockwise select mode (g CTRL-H) - func Test_blockwise_select_mode() - new - call setline(1, ['foo', 'bar']) - call feedkeys("g\\\mm", 'xt') - call assert_equal(['mmo', 'mmr'], getline(1, '$')) - close! - endfunc - func Test_visual_mode_put() new --- 618,623 ---- *************** *** 743,758 **** bwipe! endfunc ! func Test_select_mode_gv() new ! " gv in exclusive select mode after operation call append('$', ['zzz ', 'äà ']) set selection=exclusive normal Gkv3lyjv3lpgvcxxx call assert_equal(['', 'zzz ', 'xxx '], getline(1, '$')) ! " gv in exclusive select mode without operation call deletebufline('', 1, '$') call append('$', 'zzz ') set selection=exclusive --- 657,672 ---- bwipe! endfunc ! func Test_gv_with_exclusive_selection() new ! " gv with exclusive selection after an operation call append('$', ['zzz ', 'äà ']) set selection=exclusive normal Gkv3lyjv3lpgvcxxx call assert_equal(['', 'zzz ', 'xxx '], getline(1, '$')) ! " gv with exclusive selection without an operation call deletebufline('', 1, '$') call append('$', 'zzz ') set selection=exclusive *************** *** 940,971 **** close! endfunc - " Test for using visual mode maps in select mode - func Test_select_mode_map() - new - vmap 3l - call setline(1, 'Test line') - call feedkeys("gh\map", 'xt') - call assert_equal('map line', getline(1)) - - vmap ygV - call feedkeys("0gh\\\cwabc", 'xt') - call assert_equal('abc line', getline(1)) - - vmap :let v=100 - call feedkeys("gggh\\\foo", 'xt') - call assert_equal('foo line', getline(1)) - - " reselect the select mode using gv from a visual mode map - vmap gv - set selectmode=cmd - call feedkeys("0gh\map", 'xt') - call assert_equal('map line', getline(1)) - set selectmode& - - close! - endfunc - " Test for changing text in visual mode with 'exclusive' selection func Test_exclusive_selection() new --- 854,859 ---- *** ../vim-8.2.0424/src/ui.c 2020-03-20 20:48:45.563983163 +0100 --- src/ui.c 2020-03-22 14:01:32.438650833 +0100 *************** *** 1046,1052 **** else if (is_drag) { // Don't try extending a selection if there isn't one. Happens when ! // button-down is in the cmdline and them moving mouse upwards. if (clip_star.state != SELECT_CLEARED) clip_process_selection(button, mouse_col, mouse_row, repeat); } --- 1046,1052 ---- else if (is_drag) { // Don't try extending a selection if there isn't one. Happens when ! // button-down is in the cmdline and then moving mouse upwards. if (clip_star.state != SELECT_CLEARED) clip_process_selection(button, mouse_col, mouse_row, repeat); } *** ../vim-8.2.0424/src/version.c 2020-03-22 13:44:25.102475151 +0100 --- src/version.c 2020-03-22 14:06:56.761543512 +0100 *************** *** 740,741 **** --- 740,743 ---- { /* Add new patch number below this line */ + /**/ + 425, /**/ -- FIRST GUARD: Ah! Now ... we're not allowed to ... SIR LAUNCELOT runs him through, grabs his spear and stabs the other guard who collapses in a heap. Hiccoughs quietly. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// 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 ///