Mercurial > vim
comparison src/testdir/test_termcodes.vim @ 19738:0208534b8a84 v8.2.0425
patch 8.2.0425: code for modeless selection not sufficiently tested
Commit: https://github.com/vim/vim/commit/515545e11f523d14343b1e588dc0b9bd3d362bc2
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Mar 22 14:08:59 2020 +0100
patch 8.2.0425: code for modeless selection not sufficiently tested
Problem: Code for modeless selection not sufficiently tested.
Solution: Add tests. Move mouse code functionality to a common script file.
(Yegappan Lakshmanan, closes #5821)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 22 Mar 2020 14:15:04 +0100 |
parents | da791e5c0139 |
children | 0927df746554 |
comparison
equal
deleted
inserted
replaced
19737:5591829276ff | 19738:0208534b8a84 |
---|---|
4 source check.vim | 4 source check.vim |
5 CheckNotGui | 5 CheckNotGui |
6 CheckUnix | 6 CheckUnix |
7 | 7 |
8 source shared.vim | 8 source shared.vim |
9 | 9 source mouse.vim |
10 " xterm2 and sgr always work, urxvt is optional. | |
11 let s:ttymouse_values = ['xterm2', 'sgr'] | |
12 if has('mouse_urxvt') | |
13 call add(s:ttymouse_values, 'urxvt') | |
14 endif | |
15 | |
16 " dec doesn't support all the functionality | |
17 if has('mouse_dec') | |
18 let s:ttymouse_dec = ['dec'] | |
19 else | |
20 let s:ttymouse_dec = [] | |
21 endif | |
22 | |
23 " netterm only supports left click | |
24 if has('mouse_netterm') | |
25 let s:ttymouse_netterm = ['netterm'] | |
26 else | |
27 let s:ttymouse_netterm = [] | |
28 endif | |
29 | |
30 " Helper function to emit a terminal escape code. | |
31 func TerminalEscapeCode(code, row, col, m) | |
32 if &ttymouse ==# 'xterm2' | |
33 " need to use byte encoding here. | |
34 let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20]) | |
35 if has('iconv') | |
36 let bytes = str->iconv('utf-8', 'latin1') | |
37 else | |
38 " Hopefully the numbers are not too big. | |
39 let bytes = str | |
40 endif | |
41 return "\<Esc>[M" .. bytes | |
42 elseif &ttymouse ==# 'sgr' | |
43 return printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m) | |
44 elseif &ttymouse ==# 'urxvt' | |
45 return printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row) | |
46 endif | |
47 endfunc | |
48 | |
49 func DecEscapeCode(code, down, row, col) | |
50 return printf("\<Esc>[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col) | |
51 endfunc | |
52 | |
53 func NettermEscapeCode(row, col) | |
54 return printf("\<Esc>}%d,%d\r", a:row, a:col) | |
55 endfunc | |
56 | |
57 func MouseLeftClickCode(row, col) | |
58 if &ttymouse ==# 'dec' | |
59 return DecEscapeCode(2, 4, a:row, a:col) | |
60 elseif &ttymouse ==# 'netterm' | |
61 return NettermEscapeCode(a:row, a:col) | |
62 else | |
63 return TerminalEscapeCode(0, a:row, a:col, 'M') | |
64 endif | |
65 endfunc | |
66 | |
67 func MouseLeftClick(row, col) | |
68 call feedkeys(MouseLeftClickCode(a:row, a:col), 'Lx!') | |
69 endfunc | |
70 | |
71 func MouseMiddleClickCode(row, col) | |
72 if &ttymouse ==# 'dec' | |
73 return DecEscapeCode(4, 2, a:row, a:col) | |
74 else | |
75 return TerminalEscapeCode(1, a:row, a:col, 'M') | |
76 endif | |
77 endfunc | |
78 | |
79 func MouseMiddleClick(row, col) | |
80 call feedkeys(MouseMiddleClickCode(a:row, a:col), 'Lx!') | |
81 endfunc | |
82 | |
83 func MouseRightClickCode(row, col) | |
84 if &ttymouse ==# 'dec' | |
85 return DecEscapeCode(6, 1, a:row, a:col) | |
86 else | |
87 return TerminalEscapeCode(2, a:row, a:col, 'M') | |
88 endif | |
89 endfunc | |
90 | |
91 func MouseRightClick(row, col) | |
92 call feedkeys(MouseRightClickCode(a:row, a:col), 'Lx!') | |
93 endfunc | |
94 | |
95 func MouseCtrlLeftClickCode(row, col) | |
96 let ctrl = 0x10 | |
97 return TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M') | |
98 endfunc | |
99 | |
100 func MouseCtrlLeftClick(row, col) | |
101 call feedkeys(MouseCtrlLeftClickCode(a:row, a:col), 'Lx!') | |
102 endfunc | |
103 | |
104 func MouseCtrlRightClickCode(row, col) | |
105 let ctrl = 0x10 | |
106 return TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M') | |
107 endfunc | |
108 | |
109 func MouseCtrlRightClick(row, col) | |
110 call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!') | |
111 endfunc | |
112 | |
113 func MouseLeftReleaseCode(row, col) | |
114 if &ttymouse ==# 'dec' | |
115 return DecEscapeCode(3, 0, a:row, a:col) | |
116 elseif &ttymouse ==# 'netterm' | |
117 return '' | |
118 else | |
119 return TerminalEscapeCode(3, a:row, a:col, 'm') | |
120 endif | |
121 endfunc | |
122 | |
123 func MouseLeftRelease(row, col) | |
124 call feedkeys(MouseLeftReleaseCode(a:row, a:col), 'Lx!') | |
125 endfunc | |
126 | |
127 func MouseMiddleReleaseCode(row, col) | |
128 if &ttymouse ==# 'dec' | |
129 return DecEscapeCode(5, 0, a:row, a:col) | |
130 else | |
131 return TerminalEscapeCode(3, a:row, a:col, 'm') | |
132 endif | |
133 endfunc | |
134 | |
135 func MouseMiddleRelease(row, col) | |
136 call feedkeys(MouseMiddleReleaseCode(a:row, a:col), 'Lx!') | |
137 endfunc | |
138 | |
139 func MouseRightReleaseCode(row, col) | |
140 if &ttymouse ==# 'dec' | |
141 return DecEscapeCode(7, 0, a:row, a:col) | |
142 else | |
143 return TerminalEscapeCode(3, a:row, a:col, 'm') | |
144 endif | |
145 endfunc | |
146 | |
147 func MouseRightRelease(row, col) | |
148 call feedkeys(MouseRightReleaseCode(a:row, a:col), 'Lx!') | |
149 endfunc | |
150 | |
151 func MouseLeftDragCode(row, col) | |
152 if &ttymouse ==# 'dec' | |
153 return DecEscapeCode(1, 4, a:row, a:col) | |
154 else | |
155 return TerminalEscapeCode(0x20, a:row, a:col, 'M') | |
156 endif | |
157 endfunc | |
158 | |
159 func MouseLeftDrag(row, col) | |
160 call feedkeys(MouseLeftDragCode(a:row, a:col), 'Lx!') | |
161 endfunc | |
162 | |
163 func MouseWheelUpCode(row, col) | |
164 return TerminalEscapeCode(0x40, a:row, a:col, 'M') | |
165 endfunc | |
166 | |
167 func MouseWheelUp(row, col) | |
168 call feedkeys(MouseWheelUpCode(a:row, a:col), 'Lx!') | |
169 endfunc | |
170 | |
171 func MouseWheelDownCode(row, col) | |
172 return TerminalEscapeCode(0x41, a:row, a:col, 'M') | |
173 endfunc | |
174 | |
175 func MouseWheelDown(row, col) | |
176 call feedkeys(MouseWheelDownCode(a:row, a:col), 'Lx!') | |
177 endfunc | |
178 | 10 |
179 func Test_term_mouse_left_click() | 11 func Test_term_mouse_left_click() |
180 new | 12 new |
181 let save_mouse = &mouse | 13 let save_mouse = &mouse |
182 let save_term = &term | 14 let save_term = &term |
183 let save_ttymouse = &ttymouse | 15 let save_ttymouse = &ttymouse |
184 call test_override('no_query_mouse', 1) | 16 call test_override('no_query_mouse', 1) |
185 set mouse=a term=xterm | 17 set mouse=a term=xterm |
186 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer']) | 18 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer']) |
187 | 19 |
188 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm | 20 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm |
189 let msg = 'ttymouse=' .. ttymouse_val | 21 let msg = 'ttymouse=' .. ttymouse_val |
190 exe 'set ttymouse=' .. ttymouse_val | 22 exe 'set ttymouse=' .. ttymouse_val |
191 go | 23 go |
192 call assert_equal([0, 1, 1, 0], getpos('.'), msg) | 24 call assert_equal([0, 1, 1, 0], getpos('.'), msg) |
193 let row = 2 | 25 let row = 2 |
213 let save_ttymouse = &ttymouse | 45 let save_ttymouse = &ttymouse |
214 call test_override('no_query_mouse', 1) | 46 call test_override('no_query_mouse', 1) |
215 set mouse=a term=xterm | 47 set mouse=a term=xterm |
216 | 48 |
217 for visual_mode in ["v", "V", "\<C-V>"] | 49 for visual_mode in ["v", "V", "\<C-V>"] |
218 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 50 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
219 let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val | 51 let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val |
220 exe 'set ttymouse=' .. ttymouse_val | 52 exe 'set ttymouse=' .. ttymouse_val |
221 | 53 |
222 call setline(1, repeat([repeat('-', 7)], 7)) | 54 call setline(1, repeat([repeat('-', 7)], 7)) |
223 call MouseLeftClick(4, 4) | 55 call MouseLeftClick(4, 4) |
282 let save_mouse = &mouse | 114 let save_mouse = &mouse |
283 let save_term = &term | 115 let save_term = &term |
284 let save_ttymouse = &ttymouse | 116 let save_ttymouse = &ttymouse |
285 set mouse=a term=xterm | 117 set mouse=a term=xterm |
286 | 118 |
287 for ttymouse_val in s:ttymouse_values | 119 for ttymouse_val in g:Ttymouse_values |
288 let msg = 'ttymouse=' .. ttymouse_val | 120 let msg = 'ttymouse=' .. ttymouse_val |
289 exe 'set ttymouse=' .. ttymouse_val | 121 exe 'set ttymouse=' .. ttymouse_val |
290 help | 122 help |
291 /usr_02.txt | 123 /usr_02.txt |
292 norm! zt | 124 norm! zt |
320 call test_override('no_query_mouse', 1) | 152 call test_override('no_query_mouse', 1) |
321 let save_quotestar = @* | 153 let save_quotestar = @* |
322 let @* = 'abc' | 154 let @* = 'abc' |
323 set mouse=a term=xterm | 155 set mouse=a term=xterm |
324 | 156 |
325 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 157 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
326 let msg = 'ttymouse=' .. ttymouse_val | 158 let msg = 'ttymouse=' .. ttymouse_val |
327 exe 'set ttymouse=' .. ttymouse_val | 159 exe 'set ttymouse=' .. ttymouse_val |
328 call setline(1, ['123456789', '123456789']) | 160 call setline(1, ['123456789', '123456789']) |
329 | 161 |
330 " Middle-click in the middle of the line pastes text where clicked. | 162 " Middle-click in the middle of the line pastes text where clicked. |
364 let save_term = &term | 196 let save_term = &term |
365 let save_ttymouse = &ttymouse | 197 let save_ttymouse = &ttymouse |
366 set mouse=a term=xterm | 198 set mouse=a term=xterm |
367 call setline(1, range(1, 100)) | 199 call setline(1, range(1, 100)) |
368 | 200 |
369 for ttymouse_val in s:ttymouse_values | 201 for ttymouse_val in g:Ttymouse_values |
370 let msg = 'ttymouse=' .. ttymouse_val | 202 let msg = 'ttymouse=' .. ttymouse_val |
371 exe 'set ttymouse=' .. ttymouse_val | 203 exe 'set ttymouse=' .. ttymouse_val |
372 go | 204 go |
373 call assert_equal(1, line('w0'), msg) | 205 call assert_equal(1, line('w0'), msg) |
374 call assert_equal([0, 1, 1, 0], getpos('.'), msg) | 206 call assert_equal([0, 1, 1, 0], getpos('.'), msg) |
411 " so we test dragging mouse below and above the window. | 243 " so we test dragging mouse below and above the window. |
412 2split | 244 2split |
413 wincmd j | 245 wincmd j |
414 2split | 246 2split |
415 | 247 |
416 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 248 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
417 let msg = 'ttymouse=' .. ttymouse_val | 249 let msg = 'ttymouse=' .. ttymouse_val |
418 exe 'set ttymouse=' .. ttymouse_val | 250 exe 'set ttymouse=' .. ttymouse_val |
419 | 251 |
420 " Line #10 at the top. | 252 " Line #10 at the top. |
421 norm! 10zt | 253 norm! 10zt |
488 let save_term = &term | 320 let save_term = &term |
489 let save_ttymouse = &ttymouse | 321 let save_ttymouse = &ttymouse |
490 call test_override('no_query_mouse', 1) | 322 call test_override('no_query_mouse', 1) |
491 set mouse=a term=xterm | 323 set mouse=a term=xterm |
492 | 324 |
493 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 325 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
494 let msg = 'ttymouse=' .. ttymouse_val | 326 let msg = 'ttymouse=' .. ttymouse_val |
495 exe 'set ttymouse=' .. ttymouse_val | 327 exe 'set ttymouse=' .. ttymouse_val |
496 | 328 |
497 " Split horizontally and test dragging the horizontal window separator. | 329 " Split horizontally and test dragging the horizontal window separator. |
498 split | 330 split |
547 let save_ttymouse = &ttymouse | 379 let save_ttymouse = &ttymouse |
548 call test_override('no_query_mouse', 1) | 380 call test_override('no_query_mouse', 1) |
549 let save_laststatus = &laststatus | 381 let save_laststatus = &laststatus |
550 set mouse=a term=xterm laststatus=2 | 382 set mouse=a term=xterm laststatus=2 |
551 | 383 |
552 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 384 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
553 let msg = 'ttymouse=' .. ttymouse_val | 385 let msg = 'ttymouse=' .. ttymouse_val |
554 exe 'set ttymouse=' .. ttymouse_val | 386 exe 'set ttymouse=' .. ttymouse_val |
555 | 387 |
556 call assert_equal(1, &cmdheight, msg) | 388 call assert_equal(1, &cmdheight, msg) |
557 let rowstatusline = winheight(0) + 1 | 389 let rowstatusline = winheight(0) + 1 |
590 let save_ttymouse = &ttymouse | 422 let save_ttymouse = &ttymouse |
591 call test_override('no_query_mouse', 1) | 423 call test_override('no_query_mouse', 1) |
592 set mouse=a term=xterm | 424 set mouse=a term=xterm |
593 let row = 1 | 425 let row = 1 |
594 | 426 |
595 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm | 427 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm |
596 let msg = 'ttymouse=' .. ttymouse_val | 428 let msg = 'ttymouse=' .. ttymouse_val |
597 exe 'set ttymouse=' .. ttymouse_val | 429 exe 'set ttymouse=' .. ttymouse_val |
598 e Xfoo | 430 e Xfoo |
599 tabnew Xbar | 431 tabnew Xbar |
600 | 432 |
640 call test_override('no_query_mouse', 1) | 472 call test_override('no_query_mouse', 1) |
641 set mouse=a term=xterm | 473 set mouse=a term=xterm |
642 let row = 1 | 474 let row = 1 |
643 let col = &columns | 475 let col = &columns |
644 | 476 |
645 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm | 477 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm |
646 if ttymouse_val ==# 'xterm2' && col > 223 | 478 if ttymouse_val ==# 'xterm2' && col > 223 |
647 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. | 479 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. |
648 continue | 480 continue |
649 endif | 481 endif |
650 let msg = 'ttymouse=' .. ttymouse_val | 482 let msg = 'ttymouse=' .. ttymouse_val |
688 call test_override('no_query_mouse', 1) | 520 call test_override('no_query_mouse', 1) |
689 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop | 521 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop |
690 set mouse=a term=xterm mousetime=1 | 522 set mouse=a term=xterm mousetime=1 |
691 let row = 1 | 523 let row = 1 |
692 | 524 |
693 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 525 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
694 let msg = 'ttymouse=' .. ttymouse_val | 526 let msg = 'ttymouse=' .. ttymouse_val |
695 exe 'set ttymouse=' .. ttymouse_val | 527 exe 'set ttymouse=' .. ttymouse_val |
696 e Xtab1 | 528 e Xtab1 |
697 tabnew Xtab2 | 529 tabnew Xtab2 |
698 | 530 |
742 " have to wait long to avoid a triple-click. | 574 " have to wait long to avoid a triple-click. |
743 set mouse=a term=xterm mousetime=200 | 575 set mouse=a term=xterm mousetime=200 |
744 let row = 1 | 576 let row = 1 |
745 let col = 10 | 577 let col = 10 |
746 | 578 |
747 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 579 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
748 let msg = 'ttymouse=' .. ttymouse_val | 580 let msg = 'ttymouse=' .. ttymouse_val |
749 exe 'set ttymouse=' .. ttymouse_val | 581 exe 'set ttymouse=' .. ttymouse_val |
750 e Xtab1 | 582 e Xtab1 |
751 tabnew Xtab2 | 583 tabnew Xtab2 |
752 | 584 |
795 let save_ttymouse = &ttymouse | 627 let save_ttymouse = &ttymouse |
796 call test_override('no_query_mouse', 1) | 628 call test_override('no_query_mouse', 1) |
797 set mouse=a term=xterm mousetime=200 | 629 set mouse=a term=xterm mousetime=200 |
798 new | 630 new |
799 | 631 |
800 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 632 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
801 let msg = 'ttymouse=' .. ttymouse_val | 633 let msg = 'ttymouse=' .. ttymouse_val |
802 exe 'set ttymouse=' .. ttymouse_val | 634 exe 'set ttymouse=' .. ttymouse_val |
803 call setline(1, ['foo [foo bar] foo', 'foo']) | 635 call setline(1, ['foo [foo bar] foo', 'foo']) |
804 | 636 |
805 " Double-click on word should visually select the word. | 637 " Double-click on word should visually select the word. |
923 let save_ttymouse = &ttymouse | 755 let save_ttymouse = &ttymouse |
924 call test_override('no_query_mouse', 1) | 756 call test_override('no_query_mouse', 1) |
925 set mouse=a term=xterm | 757 set mouse=a term=xterm |
926 let row = &lines | 758 let row = &lines |
927 | 759 |
928 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 760 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
929 let msg = 'ttymouse=' .. ttymouse_val | 761 let msg = 'ttymouse=' .. ttymouse_val |
930 exe 'set ttymouse=' .. ttymouse_val | 762 exe 'set ttymouse=' .. ttymouse_val |
931 | 763 |
932 call feedkeys(':"3456789' | 764 call feedkeys(':"3456789' |
933 \ .. MouseLeftClickCode(row, 7) | 765 \ .. MouseLeftClickCode(row, 7) |
956 let row = &lines | 788 let row = &lines |
957 " Column values does not matter, paste is done at position of cursor. | 789 " Column values does not matter, paste is done at position of cursor. |
958 let col = 1 | 790 let col = 1 |
959 let @* = 'paste' | 791 let @* = 'paste' |
960 | 792 |
961 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec | 793 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec |
962 let msg = 'ttymouse=' .. ttymouse_val | 794 let msg = 'ttymouse=' .. ttymouse_val |
963 exe 'set ttymouse=' .. ttymouse_val | 795 exe 'set ttymouse=' .. ttymouse_val |
964 | 796 |
965 call feedkeys(":\"->" | 797 call feedkeys(":\"->" |
966 \ .. MouseMiddleReleaseCode(row, col) | 798 \ .. MouseMiddleReleaseCode(row, col) |
993 | 825 |
994 menu PopUp.foo :let g:menustr = 'foo'<CR> | 826 menu PopUp.foo :let g:menustr = 'foo'<CR> |
995 menu PopUp.bar :let g:menustr = 'bar'<CR> | 827 menu PopUp.bar :let g:menustr = 'bar'<CR> |
996 menu PopUp.baz :let g:menustr = 'baz'<CR> | 828 menu PopUp.baz :let g:menustr = 'baz'<CR> |
997 | 829 |
998 for ttymouse_val in s:ttymouse_values | 830 for ttymouse_val in g:Ttymouse_values |
999 exe 'set ttymouse=' .. ttymouse_val | 831 exe 'set ttymouse=' .. ttymouse_val |
1000 let g:menustr = '' | 832 let g:menustr = '' |
1001 call feedkeys(MouseRightClickCode(1, 4) | 833 call feedkeys(MouseRightClickCode(1, 4) |
1002 \ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x") | 834 \ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x") |
1003 call assert_equal('bar', g:menustr) | 835 call assert_equal('bar', g:menustr) |