blob: a59e1286916ef7baae079282c785585e6115eaaf [file] [log] [blame]
Bram Moolenaar3324d0a2018-03-06 19:51:13 +01001" Tests for bracketed paste and other forms of pasting.
Bram Moolenaar076e5022017-01-24 18:58:30 +01002
Bram Moolenaar832615b2019-03-23 13:30:22 +01003" Bracketed paste only works with "xterm". Not in GUI or Windows console.
Bram Moolenaar8c5a2782019-08-07 23:07:07 +02004source check.vim
5CheckNotMSWindows
6CheckNotGui
7
Bram Moolenaar076e5022017-01-24 18:58:30 +01008set term=xterm
9
Bram Moolenaara9034722018-03-13 15:43:46 +010010source shared.vim
11
Bram Moolenaar076e5022017-01-24 18:58:30 +010012func Test_paste_normal_mode()
13 new
Bram Moolenaarfd8983b2017-02-02 22:21:29 +010014 " In first column text is inserted
Bram Moolenaar076e5022017-01-24 18:58:30 +010015 call setline(1, ['a', 'b', 'c'])
Bram Moolenaarfd8983b2017-02-02 22:21:29 +010016 call cursor(2, 1)
Bram Moolenaar076e5022017-01-24 18:58:30 +010017 call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
Bram Moolenaarfd8983b2017-02-02 22:21:29 +010018 call assert_equal('foo', getline(2))
19 call assert_equal('barb', getline(3))
Bram Moolenaar076e5022017-01-24 18:58:30 +010020 call assert_equal('c', getline(4))
21
Bram Moolenaarfd8983b2017-02-02 22:21:29 +010022 " When repeating text is appended
Bram Moolenaar076e5022017-01-24 18:58:30 +010023 normal .
24 call assert_equal('barfoo', getline(3))
Bram Moolenaarfd8983b2017-02-02 22:21:29 +010025 call assert_equal('barb', getline(4))
Bram Moolenaar076e5022017-01-24 18:58:30 +010026 call assert_equal('c', getline(5))
27 bwipe!
Bram Moolenaarfd8983b2017-02-02 22:21:29 +010028
29 " In second column text is appended
30 call setline(1, ['a', 'bbb', 'c'])
31 call cursor(2, 2)
32 call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
33 call assert_equal('bbfoo', getline(2))
34 call assert_equal('barb', getline(3))
35 call assert_equal('c', getline(4))
36
37 " In last column text is appended
38 call setline(1, ['a', 'bbb', 'c'])
39 call cursor(2, 3)
40 call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
41 call assert_equal('bbbfoo', getline(2))
42 call assert_equal('bar', getline(3))
43 call assert_equal('c', getline(4))
Bram Moolenaar076e5022017-01-24 18:58:30 +010044endfunc
45
46func Test_paste_insert_mode()
47 new
48 call setline(1, ['a', 'b', 'c'])
49 2
50 call feedkeys("i\<Esc>[200~foo\<CR>bar\<Esc>[201~ done\<Esc>", 'xt')
51 call assert_equal('foo', getline(2))
52 call assert_equal('bar doneb', getline(3))
53 call assert_equal('c', getline(4))
54
55 normal .
56 call assert_equal('bar donfoo', getline(3))
57 call assert_equal('bar doneeb', getline(4))
58 call assert_equal('c', getline(5))
Bram Moolenaar9e817c82017-01-25 21:36:17 +010059
60 set ai et tw=10
61 call setline(1, ['a', ' b', 'c'])
62 2
63 call feedkeys("A\<Esc>[200~foo\<CR> bar bar bar\<Esc>[201~\<Esc>", 'xt')
64 call assert_equal(' bfoo', getline(2))
65 call assert_equal(' bar bar bar', getline(3))
66 call assert_equal('c', getline(4))
67
68 set ai& et& tw=0
Bram Moolenaar076e5022017-01-24 18:58:30 +010069 bwipe!
70endfunc
71
Bram Moolenaar3324d0a2018-03-06 19:51:13 +010072func Test_paste_clipboard()
Bram Moolenaar52992fe2019-08-12 14:20:33 +020073 CheckFeature clipboard_working
74
Bram Moolenaar3324d0a2018-03-06 19:51:13 +010075 let @+ = "nasty\<Esc>:!ls\<CR>command"
76 new
77 exe "normal i\<C-R>+\<Esc>"
78 call assert_equal("nasty\<Esc>:!ls\<CR>command", getline(1))
79 bwipe!
80endfunc
81
Bram Moolenaar845e0ee2020-06-20 16:05:32 +020082" bracketed paste in command line
Bram Moolenaar076e5022017-01-24 18:58:30 +010083func Test_paste_cmdline()
84 call feedkeys(":a\<Esc>[200~foo\<CR>bar\<Esc>[201~b\<Home>\"\<CR>", 'xt')
85 call assert_equal("\"afoo\<CR>barb", getreg(':'))
86endfunc
Bram Moolenaara1891842017-02-04 21:34:31 +010087
Bram Moolenaar845e0ee2020-06-20 16:05:32 +020088" bracketed paste in Ex-mode
89func Test_paste_ex_mode()
90 unlet! foo
91 call feedkeys("Qlet foo=\"\<Esc>[200~foo\<CR>bar\<Esc>[201~\"\<CR>vi\<CR>", 'xt')
92 call assert_equal("foo\rbar", foo)
Bram Moolenaar806d0372022-01-25 20:45:16 +000093
94 " pasting more than 40 bytes
95 exe "norm Q\<PasteStart>0000000000000000000000000000000000000000000000000000000000000000000000\<C-C>"
Bram Moolenaar845e0ee2020-06-20 16:05:32 +020096endfunc
97
98func Test_paste_onechar()
99 new
100 let @f='abc'
101 call feedkeys("i\<C-R>\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
102 call assert_equal("abc", getline(1))
103 close!
104endfunc
105
Bram Moolenaara1891842017-02-04 21:34:31 +0100106func Test_paste_visual_mode()
107 new
108 call setline(1, 'here are some words')
109 call feedkeys("0fsve\<Esc>[200~more\<Esc>[201~", 'xt')
110 call assert_equal('here are more words', getline(1))
111 call assert_equal('some', getreg('-'))
zeertzjq7a732522022-03-14 20:46:41 +0000112 normal! u
113 call assert_equal('here are some words', getline(1))
114 exe "normal! \<C-R>"
115 call assert_equal('here are more words', getline(1))
Bram Moolenaara1891842017-02-04 21:34:31 +0100116
117 " include last char in the line
118 call feedkeys("0fwve\<Esc>[200~noises\<Esc>[201~", 'xt')
119 call assert_equal('here are more noises', getline(1))
120 call assert_equal('words', getreg('-'))
zeertzjq7a732522022-03-14 20:46:41 +0000121 normal! u
122 call assert_equal('here are more words', getline(1))
123 exe "normal! \<C-R>"
124 call assert_equal('here are more noises', getline(1))
Bram Moolenaara1891842017-02-04 21:34:31 +0100125
126 " exclude last char in the line
127 call setline(1, 'some words!')
128 call feedkeys("0fwve\<Esc>[200~noises\<Esc>[201~", 'xt')
129 call assert_equal('some noises!', getline(1))
130 call assert_equal('words', getreg('-'))
zeertzjq7a732522022-03-14 20:46:41 +0000131 normal! u
132 call assert_equal('some words!', getline(1))
133 exe "normal! \<C-R>"
134 call assert_equal('some noises!', getline(1))
Bram Moolenaara1891842017-02-04 21:34:31 +0100135
136 " multi-line selection
137 call setline(1, ['some words', 'and more'])
138 call feedkeys("0fwvj0fd\<Esc>[200~letters\<Esc>[201~", 'xt')
139 call assert_equal('some letters more', getline(1))
140 call assert_equal("words\nand", getreg('1'))
zeertzjq7a732522022-03-14 20:46:41 +0000141 normal! u
142 call assert_equal(['some words', 'and more'], getline(1, 2))
143 exe "normal! \<C-R>"
144 call assert_equal('some letters more', getline(1))
145
146 " linewise non-last line, cursor at start of line
147 call setline(1, ['some words', 'and more'])
148 call feedkeys("0V\<Esc>[200~letters\<Esc>[201~", 'xt')
149 call assert_equal('lettersand more', getline(1))
150 call assert_equal("some words\n", getreg('1'))
151 normal! u
152 call assert_equal(['some words', 'and more'], getline(1, 2))
153 exe "normal! \<C-R>"
154 call assert_equal('lettersand more', getline(1))
155
156 " linewise non-last line, cursor in the middle of line
157 call setline(1, ['some words', 'and more'])
158 call feedkeys("0fwV\<Esc>[200~letters\<Esc>[201~", 'xt')
159 call assert_equal('lettersand more', getline(1))
160 call assert_equal("some words\n", getreg('1'))
161 normal! u
162 call assert_equal(['some words', 'and more'], getline(1, 2))
163 exe "normal! \<C-R>"
164 call assert_equal('lettersand more', getline(1))
165
166 " linewise last line
167 call setline(1, ['some words', 'and more'])
168 call feedkeys("j0V\<Esc>[200~letters\<Esc>[201~", 'xt')
169 call assert_equal(['some words', 'letters'], getline(1, 2))
170 call assert_equal("and more\n", getreg('1'))
171 normal! u
172 call assert_equal(['some words', 'and more'], getline(1, 2))
173 exe "normal! \<C-R>"
174 call assert_equal(['some words', 'letters'], getline(1, 2))
Bram Moolenaara1891842017-02-04 21:34:31 +0100175
176 bwipe!
177endfunc
Bram Moolenaard4aa83a2019-05-09 18:59:31 +0200178
179func CheckCopyPaste()
180 call setline(1, ['copy this', ''])
181 normal 1G0"*y$
182 normal j"*p
183 call assert_equal('copy this', getline(2))
184endfunc
185
186func Test_xrestore()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200187 CheckFeature xterm_clipboard
Bram Moolenaarf08b0eb2021-10-16 13:00:14 +0100188 let g:test_is_flaky = 1
189
Bram Moolenaard4aa83a2019-05-09 18:59:31 +0200190 let display = $DISPLAY
191 new
192 call CheckCopyPaste()
193
194 xrestore
195 call CheckCopyPaste()
196
197 exe "xrestore " .. display
198 call CheckCopyPaste()
199
Bram Moolenaard4aa83a2019-05-09 18:59:31 +0200200 bwipe!
201endfunc
Bram Moolenaar845e0ee2020-06-20 16:05:32 +0200202
Bram Moolenaarf4fcedc2021-03-15 18:36:20 +0100203" Test for 'pastetoggle'
204func Test_pastetoggle()
205 new
206 set pastetoggle=<F4>
207 set nopaste
208 call feedkeys("iHello\<F4>", 'xt')
209 call assert_true(&paste)
210 call feedkeys("i\<F4>", 'xt')
211 call assert_false(&paste)
212 call assert_equal('Hello', getline(1))
Yegappan Lakshmanan2d6d7182021-06-13 21:52:48 +0200213 " command-line completion for 'pastetoggle' value
214 call feedkeys(":set pastetoggle=\<Tab>\<C-B>\"\<CR>", 'xt')
215 call assert_equal('"set pastetoggle=<F4>', @:)
Bram Moolenaarf4fcedc2021-03-15 18:36:20 +0100216 set pastetoggle&
217 bwipe!
218endfunc
219
Yegappan Lakshmanan2d6d7182021-06-13 21:52:48 +0200220" Test for restoring option values when 'paste' is disabled
221func Test_paste_opt_restore()
222 set autoindent expandtab ruler showmatch
223 if has('rightleft')
224 set revins hkmap
225 endif
226 set smarttab softtabstop=3 textwidth=27 wrapmargin=12
227 if has('vartabs')
228 set varsofttabstop=10,20
229 endif
230
231 " enabling 'paste' should reset the above options
232 set paste
233 call assert_false(&autoindent)
234 call assert_false(&expandtab)
235 if has('rightleft')
236 call assert_false(&revins)
237 call assert_false(&hkmap)
238 endif
239 call assert_false(&ruler)
240 call assert_false(&showmatch)
241 call assert_false(&smarttab)
242 call assert_equal(0, &softtabstop)
243 call assert_equal(0, &textwidth)
244 call assert_equal(0, &wrapmargin)
245 if has('vartabs')
246 call assert_equal('', &varsofttabstop)
247 endif
248
249 " disabling 'paste' should restore the option values
250 set nopaste
251 call assert_true(&autoindent)
252 call assert_true(&expandtab)
253 if has('rightleft')
254 call assert_true(&revins)
255 call assert_true(&hkmap)
256 endif
257 call assert_true(&ruler)
258 call assert_true(&showmatch)
259 call assert_true(&smarttab)
260 call assert_equal(3, &softtabstop)
261 call assert_equal(27, &textwidth)
262 call assert_equal(12, &wrapmargin)
263 if has('vartabs')
264 call assert_equal('10,20', &varsofttabstop)
265 endif
266
267 set autoindent& expandtab& ruler& showmatch&
268 if has('rightleft')
269 set revins& hkmap&
270 endif
271 set smarttab& softtabstop& textwidth& wrapmargin&
272 if has('vartabs')
273 set varsofttabstop&
274 endif
275endfunc
276
Bram Moolenaar845e0ee2020-06-20 16:05:32 +0200277" vim: shiftwidth=2 sts=2 expandtab