1515545e1SBram Moolenaar" Test for Select-mode
2515545e1SBram Moolenaar
3515545e1SBram Moolenaar" This only works for Unix in a terminal
4515545e1SBram Moolenaarsource check.vim
5515545e1SBram MoolenaarCheckNotGui
6515545e1SBram MoolenaarCheckUnix
7515545e1SBram Moolenaar
8515545e1SBram Moolenaarsource mouse.vim
9515545e1SBram Moolenaar
10515545e1SBram Moolenaar" Test for select mode
11515545e1SBram Moolenaarfunc Test_selectmode_basic()
12515545e1SBram Moolenaar  new
13515545e1SBram Moolenaar  call setline(1, range(1,100))
14515545e1SBram Moolenaar  50
15515545e1SBram Moolenaar  norm! gHy
16515545e1SBram Moolenaar  call assert_equal('y51', getline('.'))
17515545e1SBram Moolenaar  call setline(1, range(1,100))
18515545e1SBram Moolenaar  50
19515545e1SBram Moolenaar  exe ":norm! V9jo\<c-g>y"
20515545e1SBram Moolenaar  call assert_equal('y60', getline('.'))
21515545e1SBram Moolenaar  call setline(1, range(1,100))
22515545e1SBram Moolenaar  50
23515545e1SBram Moolenaar  call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
24515545e1SBram Moolenaar  call assert_equal('c51', getline('.'))
25515545e1SBram Moolenaar  " clean up
26515545e1SBram Moolenaar  bw!
27515545e1SBram Moolenaarendfunc
28515545e1SBram Moolenaar
29515545e1SBram Moolenaar" Test for starting selectmode
30515545e1SBram Moolenaarfunc Test_selectmode_start()
31515545e1SBram Moolenaar  new
32515545e1SBram Moolenaar  set selectmode=key keymodel=startsel
33515545e1SBram Moolenaar  call setline(1, ['abc', 'def', 'ghi'])
34515545e1SBram Moolenaar  call cursor(1, 4)
35515545e1SBram Moolenaar  call feedkeys("A\<s-home>start\<esc>", 'txin')
36515545e1SBram Moolenaar  call assert_equal(['startdef', 'ghi'], getline(1, '$'))
37515545e1SBram Moolenaar  " start select mode again with gv
38515545e1SBram Moolenaar  set selectmode=cmd
39515545e1SBram Moolenaar  call feedkeys('gvabc', 'xt')
40515545e1SBram Moolenaar  call assert_equal('abctdef', getline(1))
41845e0ee5SBram Moolenaar  " arrow keys without shift should not start selection
42845e0ee5SBram Moolenaar  call feedkeys("A\<Home>\<Right>\<Left>ro", 'xt')
43845e0ee5SBram Moolenaar  call assert_equal('roabctdef', getline(1))
44515545e1SBram Moolenaar  set selectmode= keymodel=
45515545e1SBram Moolenaar  bw!
46515545e1SBram Moolenaarendfunc
47515545e1SBram Moolenaar
48515545e1SBram Moolenaar" Test for characterwise select mode
49515545e1SBram Moolenaarfunc Test_characterwise_select_mode()
50515545e1SBram Moolenaar  new
51515545e1SBram Moolenaar
52515545e1SBram Moolenaar  " Select mode maps
53515545e1SBram Moolenaar  snoremap <lt>End> <End>
54515545e1SBram Moolenaar  snoremap <lt>Down> <Down>
55515545e1SBram Moolenaar  snoremap <lt>Del> <Del>
56515545e1SBram Moolenaar
57515545e1SBram Moolenaar  " characterwise select mode: delete middle line
58515545e1SBram Moolenaar  call deletebufline('', 1, '$')
59515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
60515545e1SBram Moolenaar  exe "normal Gkkgh\<End>\<Del>"
61515545e1SBram Moolenaar  call assert_equal(['', 'b', 'c'], getline(1, '$'))
62515545e1SBram Moolenaar
63515545e1SBram Moolenaar  " characterwise select mode: delete middle two lines
64515545e1SBram Moolenaar  call deletebufline('', 1, '$')
65515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
66515545e1SBram Moolenaar  exe "normal Gkkgh\<Down>\<End>\<Del>"
67515545e1SBram Moolenaar  call assert_equal(['', 'c'], getline(1, '$'))
68515545e1SBram Moolenaar
69515545e1SBram Moolenaar  " characterwise select mode: delete last line
70515545e1SBram Moolenaar  call deletebufline('', 1, '$')
71515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
72515545e1SBram Moolenaar  exe "normal Ggh\<End>\<Del>"
73515545e1SBram Moolenaar  call assert_equal(['', 'a', 'b', ''], getline(1, '$'))
74515545e1SBram Moolenaar
75515545e1SBram Moolenaar  " characterwise select mode: delete last two lines
76515545e1SBram Moolenaar  call deletebufline('', 1, '$')
77515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
78515545e1SBram Moolenaar  exe "normal Gkgh\<Down>\<End>\<Del>"
79515545e1SBram Moolenaar  call assert_equal(['', 'a', ''], getline(1, '$'))
80515545e1SBram Moolenaar
81515545e1SBram Moolenaar  " CTRL-H in select mode behaves like 'x'
82515545e1SBram Moolenaar  call setline(1, 'abcdef')
83515545e1SBram Moolenaar  exe "normal! gggh\<Right>\<Right>\<Right>\<C-H>"
84515545e1SBram Moolenaar  call assert_equal('ef', getline(1))
85515545e1SBram Moolenaar
86515545e1SBram Moolenaar  " CTRL-O in select mode switches to visual mode for one command
87515545e1SBram Moolenaar  call setline(1, 'abcdef')
88515545e1SBram Moolenaar  exe "normal! gggh\<C-O>3lm"
89515545e1SBram Moolenaar  call assert_equal('mef', getline(1))
90515545e1SBram Moolenaar
91515545e1SBram Moolenaar  sunmap <lt>End>
92515545e1SBram Moolenaar  sunmap <lt>Down>
93515545e1SBram Moolenaar  sunmap <lt>Del>
94515545e1SBram Moolenaar  bwipe!
95515545e1SBram Moolenaarendfunc
96515545e1SBram Moolenaar
97515545e1SBram Moolenaar" Test for linewise select mode
98515545e1SBram Moolenaarfunc Test_linewise_select_mode()
99515545e1SBram Moolenaar  new
100515545e1SBram Moolenaar
101515545e1SBram Moolenaar  " linewise select mode: delete middle line
102515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
103515545e1SBram Moolenaar  exe "normal GkkgH\<Del>"
104515545e1SBram Moolenaar  call assert_equal(['', 'b', 'c'], getline(1, '$'))
105515545e1SBram Moolenaar
106515545e1SBram Moolenaar  " linewise select mode: delete middle two lines
107515545e1SBram Moolenaar  call deletebufline('', 1, '$')
108515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
109515545e1SBram Moolenaar  exe "normal GkkgH\<Down>\<Del>"
110515545e1SBram Moolenaar  call assert_equal(['', 'c'], getline(1, '$'))
111515545e1SBram Moolenaar
112515545e1SBram Moolenaar  " linewise select mode: delete last line
113515545e1SBram Moolenaar  call deletebufline('', 1, '$')
114515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
115515545e1SBram Moolenaar  exe "normal GgH\<Del>"
116515545e1SBram Moolenaar  call assert_equal(['', 'a', 'b'], getline(1, '$'))
117515545e1SBram Moolenaar
118515545e1SBram Moolenaar  " linewise select mode: delete last two lines
119515545e1SBram Moolenaar  call deletebufline('', 1, '$')
120515545e1SBram Moolenaar  call append('$', ['a', 'b', 'c'])
121515545e1SBram Moolenaar  exe "normal GkgH\<Down>\<Del>"
122515545e1SBram Moolenaar  call assert_equal(['', 'a'], getline(1, '$'))
123515545e1SBram Moolenaar
124515545e1SBram Moolenaar  bwipe!
125515545e1SBram Moolenaarendfunc
126515545e1SBram Moolenaar
127515545e1SBram Moolenaar" Test for blockwise select mode (g CTRL-H)
128515545e1SBram Moolenaarfunc Test_blockwise_select_mode()
129515545e1SBram Moolenaar  new
130515545e1SBram Moolenaar  call setline(1, ['foo', 'bar'])
131515545e1SBram Moolenaar  call feedkeys("g\<BS>\<Right>\<Down>mm", 'xt')
132515545e1SBram Moolenaar  call assert_equal(['mmo', 'mmr'], getline(1, '$'))
133515545e1SBram Moolenaar  close!
134515545e1SBram Moolenaarendfunc
135515545e1SBram Moolenaar
136515545e1SBram Moolenaar" Test for using visual mode maps in select mode
137515545e1SBram Moolenaarfunc Test_select_mode_map()
138515545e1SBram Moolenaar  new
139515545e1SBram Moolenaar  vmap <buffer> <F2> 3l
140515545e1SBram Moolenaar  call setline(1, 'Test line')
141515545e1SBram Moolenaar  call feedkeys("gh\<F2>map", 'xt')
142515545e1SBram Moolenaar  call assert_equal('map line', getline(1))
143515545e1SBram Moolenaar
144515545e1SBram Moolenaar  vmap <buffer> <F2> ygV
145515545e1SBram Moolenaar  call feedkeys("0gh\<Right>\<Right>\<F2>cwabc", 'xt')
146515545e1SBram Moolenaar  call assert_equal('abc line', getline(1))
147515545e1SBram Moolenaar
148515545e1SBram Moolenaar  vmap <buffer> <F2> :<C-U>let v=100<CR>
149515545e1SBram Moolenaar  call feedkeys("gggh\<Right>\<Right>\<F2>foo", 'xt')
150515545e1SBram Moolenaar  call assert_equal('foo line', getline(1))
151515545e1SBram Moolenaar
152515545e1SBram Moolenaar  " reselect the select mode using gv from a visual mode map
153515545e1SBram Moolenaar  vmap <buffer> <F2> gv
154515545e1SBram Moolenaar  set selectmode=cmd
155515545e1SBram Moolenaar  call feedkeys("0gh\<F2>map", 'xt')
156515545e1SBram Moolenaar  call assert_equal('map line', getline(1))
157515545e1SBram Moolenaar  set selectmode&
158515545e1SBram Moolenaar
159515545e1SBram Moolenaar  close!
160515545e1SBram Moolenaarendfunc
161515545e1SBram Moolenaar
162515545e1SBram Moolenaar" Test double/triple/quadruple click to start 'select' mode
163515545e1SBram Moolenaarfunc Test_term_mouse_multiple_clicks_to_select_mode()
164515545e1SBram Moolenaar  let save_mouse = &mouse
165515545e1SBram Moolenaar  let save_term = &term
166515545e1SBram Moolenaar  let save_ttymouse = &ttymouse
167515545e1SBram Moolenaar  call test_override('no_query_mouse', 1)
168*1e448465SBram Moolenaar
169*1e448465SBram Moolenaar  " 'mousetime' must be sufficiently large, or else the test is flaky when
170*1e448465SBram Moolenaar  " using a ssh connection with X forwarding; i.e. ssh -X.
171*1e448465SBram Moolenaar  set mouse=a term=xterm mousetime=1000
172515545e1SBram Moolenaar  set selectmode=mouse
173515545e1SBram Moolenaar  new
174515545e1SBram Moolenaar
175515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
176515545e1SBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
177515545e1SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
178515545e1SBram Moolenaar
179515545e1SBram Moolenaar    " Single-click and drag should 'select' the characters
180515545e1SBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
181515545e1SBram Moolenaar    call MouseLeftClick(1, 3)
182515545e1SBram Moolenaar    call assert_equal(0, getcharmod(), msg)
183515545e1SBram Moolenaar    call MouseLeftDrag(1, 13)
184515545e1SBram Moolenaar    call MouseLeftRelease(1, 13)
185515545e1SBram Moolenaar    norm! o
186515545e1SBram Moolenaar    call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg)
187515545e1SBram Moolenaar
188515545e1SBram Moolenaar    " Double-click on word should visually 'select' the word.
189515545e1SBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
190515545e1SBram Moolenaar    call MouseLeftClick(1, 2)
191515545e1SBram Moolenaar    call assert_equal(0, getcharmod(), msg)
192515545e1SBram Moolenaar    call MouseLeftRelease(1, 2)
193515545e1SBram Moolenaar    call MouseLeftClick(1, 2)
194515545e1SBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
195515545e1SBram Moolenaar    call MouseLeftRelease(1, 2)
196515545e1SBram Moolenaar    call assert_equal('s', mode(), msg)
197515545e1SBram Moolenaar    norm! bar
198515545e1SBram Moolenaar    call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg)
199515545e1SBram Moolenaar
200515545e1SBram Moolenaar    " Double-click on opening square bracket should visually
201515545e1SBram Moolenaar    " 'select' the whole [foo bar].
202515545e1SBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
203515545e1SBram Moolenaar    call MouseLeftClick(1, 5)
204515545e1SBram Moolenaar    call assert_equal(0, getcharmod(), msg)
205515545e1SBram Moolenaar    call MouseLeftRelease(1, 5)
206515545e1SBram Moolenaar    call MouseLeftClick(1, 5)
207515545e1SBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
208515545e1SBram Moolenaar    call MouseLeftRelease(1, 5)
209515545e1SBram Moolenaar    call assert_equal('s', mode(), msg)
210515545e1SBram Moolenaar    norm! bar
211515545e1SBram Moolenaar    call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg)
212515545e1SBram Moolenaar
213515545e1SBram Moolenaar    " To guarantee that the next click is not counted as a triple click
214515545e1SBram Moolenaar    call MouseRightClick(1, 1)
215515545e1SBram Moolenaar    call MouseRightRelease(1, 1)
216515545e1SBram Moolenaar
217515545e1SBram Moolenaar    " Triple-click should visually 'select' the whole line.
218515545e1SBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
219515545e1SBram Moolenaar    call MouseLeftClick(1, 3)
220515545e1SBram Moolenaar    call assert_equal(0, getcharmod(), msg)
221515545e1SBram Moolenaar    call MouseLeftRelease(1, 3)
222515545e1SBram Moolenaar    call MouseLeftClick(1, 3)
223515545e1SBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
224515545e1SBram Moolenaar    call MouseLeftRelease(1, 3)
225515545e1SBram Moolenaar    call MouseLeftClick(1, 3)
226515545e1SBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
227515545e1SBram Moolenaar    call MouseLeftRelease(1, 3)
228515545e1SBram Moolenaar    call assert_equal('S', mode(), msg)
229515545e1SBram Moolenaar    norm! baz
230515545e1SBram Moolenaar    call assert_equal(['bazfoo'], getline(1, '$'), msg)
231515545e1SBram Moolenaar
232515545e1SBram Moolenaar    " Quadruple-click should start visual block 'select'.
233515545e1SBram Moolenaar    call setline(1, ['aaaaaa', 'bbbbbb'])
234515545e1SBram Moolenaar    call MouseLeftClick(1, 2)
235515545e1SBram Moolenaar    call assert_equal(0, getcharmod(), msg)
236515545e1SBram Moolenaar    call MouseLeftRelease(1, 2)
237515545e1SBram Moolenaar    call MouseLeftClick(1, 2)
238515545e1SBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
239515545e1SBram Moolenaar    call MouseLeftRelease(1, 2)
240515545e1SBram Moolenaar    call MouseLeftClick(1, 2)
241515545e1SBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
242515545e1SBram Moolenaar    call MouseLeftRelease(1, 2)
243515545e1SBram Moolenaar    call MouseLeftClick(1, 2)
244515545e1SBram Moolenaar    call assert_equal(96, getcharmod(), msg) " quadruple-click
245515545e1SBram Moolenaar    call MouseLeftDrag(2, 4)
246515545e1SBram Moolenaar    call MouseLeftRelease(2, 4)
247515545e1SBram Moolenaar    call assert_equal("\<c-s>", mode(), msg)
248515545e1SBram Moolenaar    norm! x
249515545e1SBram Moolenaar    call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg)
250515545e1SBram Moolenaar  endfor
251515545e1SBram Moolenaar
252515545e1SBram Moolenaar  let &mouse = save_mouse
253515545e1SBram Moolenaar  let &term = save_term
254515545e1SBram Moolenaar  let &ttymouse = save_ttymouse
255515545e1SBram Moolenaar  set mousetime&
256515545e1SBram Moolenaar  set selectmode&
257515545e1SBram Moolenaar  call test_override('no_query_mouse', 0)
258515545e1SBram Moolenaar  bwipe!
259515545e1SBram Moolenaarendfunc
260515545e1SBram Moolenaar
261515545e1SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
262