xref: /vim-8.2.3635/src/testdir/test_mapping.vim (revision 2a953fcf)
1" Tests for mappings and abbreviations
2
3func Test_abbreviation()
4  " abbreviation with 0x80 should work
5  inoreab чкпр   vim
6  call feedkeys("Goчкпр \<Esc>", "xt")
7  call assert_equal('vim ', getline('$'))
8  iunab чкпр
9  set nomodified
10endfunc
11
12func Test_map_ctrl_c_insert()
13  " mapping of ctrl-c in Insert mode
14  set cpo-=< cpo-=k
15  inoremap <c-c> <ctrl-c>
16  cnoremap <c-c> dummy
17  cunmap <c-c>
18  call feedkeys("GoTEST2: CTRL-C |\<C-C>A|\<Esc>", "xt")
19  call assert_equal('TEST2: CTRL-C |<ctrl-c>A|', getline('$'))
20  unmap! <c-c>
21  set nomodified
22endfunc
23
24func Test_map_ctrl_c_visual()
25  " mapping of ctrl-c in Visual mode
26  vnoremap <c-c> :<C-u>$put ='vmap works'
27  call feedkeys("GV\<C-C>\<CR>", "xt")
28  call assert_equal('vmap works', getline('$'))
29  vunmap <c-c>
30  set nomodified
31endfunc
32
33func Test_map_langmap()
34  if !has('langmap')
35    return
36  endif
37
38  " check langmap applies in normal mode
39  set langmap=+- nolangremap
40  new
41  call setline(1, ['a', 'b', 'c'])
42  2
43  call assert_equal('b', getline('.'))
44  call feedkeys("+", "xt")
45  call assert_equal('a', getline('.'))
46
47  " check no remapping
48  map x +
49  2
50  call feedkeys("x", "xt")
51  call assert_equal('c', getline('.'))
52
53  " check with remapping
54  set langremap
55  2
56  call feedkeys("x", "xt")
57  call assert_equal('a', getline('.'))
58
59  unmap x
60  bwipe!
61
62  " 'langnoremap' follows 'langremap' and vise versa
63  set langremap
64  set langnoremap
65  call assert_equal(0, &langremap)
66  set langremap
67  call assert_equal(0, &langnoremap)
68  set nolangremap
69  call assert_equal(1, &langnoremap)
70
71  " check default values
72  set langnoremap&
73  call assert_equal(0, &langnoremap)
74  call assert_equal(1, &langremap)
75  set langremap&
76  call assert_equal(0, &langnoremap)
77  call assert_equal(1, &langremap)
78
79  " langmap should not apply in insert mode, 'langremap' doesn't matter
80  set langmap=+{ nolangremap
81  call feedkeys("Go+\<Esc>", "xt")
82  call assert_equal('+', getline('$'))
83  set langmap=+{ langremap
84  call feedkeys("Go+\<Esc>", "xt")
85  call assert_equal('+', getline('$'))
86
87  " langmap used for register name in insert mode.
88  call setreg('a', 'aaaa')
89  call setreg('b', 'bbbb')
90  call setreg('c', 'cccc')
91  set langmap=ab langremap
92  call feedkeys("Go\<C-R>a\<Esc>", "xt")
93  call assert_equal('bbbb', getline('$'))
94  call feedkeys("Go\<C-R>\<C-R>a\<Esc>", "xt")
95  call assert_equal('bbbb', getline('$'))
96  " mapping does not apply
97  imap c a
98  call feedkeys("Go\<C-R>c\<Esc>", "xt")
99  call assert_equal('cccc', getline('$'))
100  imap a c
101  call feedkeys("Go\<C-R>a\<Esc>", "xt")
102  call assert_equal('bbbb', getline('$'))
103
104  " langmap should not apply in Command-line mode
105  set langmap=+{ nolangremap
106  call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
107  call assert_equal('+', getline('$'))
108
109  iunmap a
110  iunmap c
111  set nomodified
112endfunc
113
114func Test_map_feedkeys()
115  " issue #212 (feedkeys insert mapping at current position)
116  nnoremap . :call feedkeys(".", "in")<cr>
117  call setline('$', ['a b c d', 'a b c d'])
118  $-1
119  call feedkeys("0qqdw.ifoo\<Esc>qj0@q\<Esc>", "xt")
120  call assert_equal(['fooc d', 'fooc d'], getline(line('$') - 1, line('$')))
121  nunmap .
122  set nomodified
123endfunc
124
125func Test_map_cursor()
126  " <c-g>U<cursor> works only within a single line
127  imapclear
128  imap ( ()<c-g>U<left>
129  call feedkeys("G2o\<Esc>ki\<CR>Test1: text with a (here some more text\<Esc>k.", "xt")
130  call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 2))
131  call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 1))
132
133  " test undo
134  call feedkeys("G2o\<Esc>ki\<CR>Test2: text wit a (here some more text [und undo]\<C-G>u\<Esc>k.u", "xt")
135  call assert_equal('', getline(line('$') - 2))
136  call assert_equal('Test2: text wit a (here some more text [und undo])', getline(line('$') - 1))
137  set nomodified
138  imapclear
139endfunc
140
141" This isn't actually testing a mapping, but similar use of CTRL-G U as above.
142func Test_break_undo()
143  :set whichwrap=<,>,[,]
144  call feedkeys("G4o2k", "xt")
145  exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line here\<esc>\<up>\<up>."
146  call assert_equal('new line here', getline(line('$') - 3))
147  call assert_equal('Test3: text with a (parenthesis here', getline(line('$') - 2))
148  call assert_equal('new line here', getline(line('$') - 1))
149  set nomodified
150endfunc
151
152func Test_map_meta_quotes()
153  imap <M-"> foo
154  call feedkeys("Go-\<M-\">-\<Esc>", "xt")
155  call assert_equal("-foo-", getline('$'))
156  set nomodified
157  iunmap <M-">
158endfunc
159
160func Test_abbr_after_line_join()
161  new
162  abbr foo bar
163  set backspace=indent,eol,start
164  exe "normal o\<BS>foo "
165  call assert_equal("bar ", getline(1))
166  bwipe!
167  unabbr foo
168  set backspace&
169endfunc
170
171func Test_map_timeout()
172  nnoremap aaaa :let got_aaaa = 1<CR>
173  nnoremap bb :let got_bb = 1<CR>
174  nmap b aaa
175  new
176  func ExitInsert(timer)
177    let g:line = getline(1)
178    call feedkeys("\<Esc>", "t")
179  endfunc
180  set timeout timeoutlen=200
181  call timer_start(300, 'ExitInsert')
182  " After the 'b' Vim waits for another character to see if it matches 'bb'.
183  " When it times out it is expanded to "aaa", but there is no wait for
184  " "aaaa".  Can't check that reliably though.
185  call feedkeys("b", "xt!")
186  call assert_equal("aa", g:line)
187  call assert_false(exists('got_aaa'))
188  call assert_false(exists('got_bb'))
189
190  bwipe!
191  nunmap aaaa
192  nunmap bb
193  nunmap b
194  set timeoutlen&
195  delfunc ExitInsert
196endfunc
197
198func Test_abbreviation_CR()
199  new
200  func Eatchar(pat)
201    let c = nr2char(getchar(0))
202    return (c =~ a:pat) ? '' : c
203  endfunc
204  iabbrev <buffer><silent> ~~7 <c-r>=repeat('~', 7)<CR><c-r>=Eatchar('\s')<cr>
205  call feedkeys("GA~~7 \<esc>", 'xt')
206  call assert_equal('~~~~~~~', getline('$'))
207  %d
208  call feedkeys("GA~~7\<cr>\<esc>", 'xt')
209  call assert_equal(['~~~~~~~', ''], getline(1,'$'))
210  delfunc Eatchar
211  bw!
212endfunc
213
214func Test_cabbr_visual_mode()
215  cabbr s su
216  call feedkeys(":s \<c-B>\"\<CR>", 'itx')
217  call assert_equal('"su ', getreg(':'))
218  call feedkeys(":'<,'>s \<c-B>\"\<CR>", 'itx')
219  let expected = '"'. "'<,'>su "
220  call assert_equal(expected, getreg(':'))
221  call feedkeys(":  '<,'>s \<c-B>\"\<CR>", 'itx')
222  let expected = '"  '. "'<,'>su "
223  call assert_equal(expected, getreg(':'))
224  call feedkeys(":'a,'bs \<c-B>\"\<CR>", 'itx')
225  let expected = '"'. "'a,'bsu "
226  call assert_equal(expected, getreg(':'))
227  cunabbr s
228endfunc
229
230func Test_motionforce_omap()
231  func GetCommand()
232    let g:m=mode(1)
233    let [g:lnum1, g:col1] = searchpos('-', 'Wb')
234    if g:lnum1 == 0
235        return "\<Esc>"
236    endif
237    let [g:lnum2, g:col2] = searchpos('-', 'W')
238    if g:lnum2 == 0
239        return "\<Esc>"
240    endif
241    return ":call Select()\<CR>"
242  endfunc
243  func Select()
244    call cursor([g:lnum1, g:col1])
245    exe "normal! 1 ". (strlen(g:m) == 2 ? 'v' : g:m[2])
246    call cursor([g:lnum2, g:col2])
247    execute "normal! \<BS>"
248  endfunc
249  new
250  onoremap <buffer><expr> i- GetCommand()
251  " 1) default omap mapping
252  %d_
253  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
254  call cursor(2, 1)
255  norm di-
256  call assert_equal('no', g:m)
257  call assert_equal(['aaa -- eee'], getline(1, '$'))
258  " 2) forced characterwise operation
259  %d_
260  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
261  call cursor(2, 1)
262  norm dvi-
263  call assert_equal('nov', g:m)
264  call assert_equal(['aaa -- eee'], getline(1, '$'))
265  " 3) forced linewise operation
266  %d_
267  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
268  call cursor(2, 1)
269  norm dVi-
270  call assert_equal('noV', g:m)
271  call assert_equal([''], getline(1, '$'))
272  " 4) forced blockwise operation
273  %d_
274  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
275  call cursor(2, 1)
276  exe "norm d\<C-V>i-"
277  call assert_equal("no\<C-V>", g:m)
278  call assert_equal(['aaabbb', 'x', 'dddeee'], getline(1, '$'))
279  bwipe!
280  delfunc Select
281  delfunc GetCommand
282endfunc
283