xref: /vim-8.2.3635/src/testdir/test_mapping.vim (revision f08b0eb8)
12d1a2487SBram Moolenaar" Tests for mappings and abbreviations
22d1a2487SBram Moolenaar
326d98218SBram Moolenaarsource shared.vim
48c5a278fSBram Moolenaarsource check.vim
54ebe0e62SBram Moolenaarsource screendump.vim
6957cf67dSBram Moolenaarsource term_util.vim
726d98218SBram Moolenaar
82d1a2487SBram Moolenaarfunc Test_abbreviation()
92d1a2487SBram Moolenaar  " abbreviation with 0x80 should work
102d1a2487SBram Moolenaar  inoreab чкпр   vim
112d1a2487SBram Moolenaar  call feedkeys("Goчкпр \<Esc>", "xt")
122d1a2487SBram Moolenaar  call assert_equal('vim ', getline('$'))
132d1a2487SBram Moolenaar  iunab чкпр
142d1a2487SBram Moolenaar  set nomodified
152d1a2487SBram Moolenaarendfunc
162d1a2487SBram Moolenaar
178485be4eSBram Moolenaarfunc Test_abclear()
188485be4eSBram Moolenaar   abbrev foo foobar
198485be4eSBram Moolenaar   iabbrev fooi foobari
208485be4eSBram Moolenaar   cabbrev fooc foobarc
218485be4eSBram Moolenaar   call assert_equal("\n\n"
228485be4eSBram Moolenaar         \        .. "c  fooc          foobarc\n"
238485be4eSBram Moolenaar         \        .. "i  fooi          foobari\n"
248485be4eSBram Moolenaar         \        .. "!  foo           foobar", execute('abbrev'))
258485be4eSBram Moolenaar
268485be4eSBram Moolenaar   iabclear
278485be4eSBram Moolenaar   call assert_equal("\n\n"
288485be4eSBram Moolenaar         \        .. "c  fooc          foobarc\n"
298485be4eSBram Moolenaar         \        .. "c  foo           foobar", execute('abbrev'))
308485be4eSBram Moolenaar   abbrev foo foobar
318485be4eSBram Moolenaar   iabbrev fooi foobari
328485be4eSBram Moolenaar
338485be4eSBram Moolenaar   cabclear
348485be4eSBram Moolenaar   call assert_equal("\n\n"
358485be4eSBram Moolenaar         \        .. "i  fooi          foobari\n"
368485be4eSBram Moolenaar         \        .. "i  foo           foobar", execute('abbrev'))
378485be4eSBram Moolenaar   abbrev foo foobar
388485be4eSBram Moolenaar   cabbrev fooc foobarc
398485be4eSBram Moolenaar
408485be4eSBram Moolenaar   abclear
418485be4eSBram Moolenaar   call assert_equal("\n\nNo abbreviation found", execute('abbrev'))
42f0cee197SBram Moolenaar   call assert_fails('%abclear', 'E481:')
438485be4eSBram Moolenaarendfunc
448485be4eSBram Moolenaar
458485be4eSBram Moolenaarfunc Test_abclear_buffer()
468485be4eSBram Moolenaar  abbrev foo foobar
478485be4eSBram Moolenaar  new X1
488485be4eSBram Moolenaar  abbrev <buffer> foo1 foobar1
498485be4eSBram Moolenaar  new X2
508485be4eSBram Moolenaar  abbrev <buffer> foo2 foobar2
518485be4eSBram Moolenaar
528485be4eSBram Moolenaar  call assert_equal("\n\n"
538485be4eSBram Moolenaar        \        .. "!  foo2         @foobar2\n"
548485be4eSBram Moolenaar        \        .. "!  foo           foobar", execute('abbrev'))
558485be4eSBram Moolenaar
568485be4eSBram Moolenaar  abclear <buffer>
578485be4eSBram Moolenaar  call assert_equal("\n\n"
588485be4eSBram Moolenaar        \        .. "!  foo           foobar", execute('abbrev'))
598485be4eSBram Moolenaar
608485be4eSBram Moolenaar  b X1
618485be4eSBram Moolenaar  call assert_equal("\n\n"
628485be4eSBram Moolenaar        \        .. "!  foo1         @foobar1\n"
638485be4eSBram Moolenaar        \        .. "!  foo           foobar", execute('abbrev'))
648485be4eSBram Moolenaar  abclear <buffer>
658485be4eSBram Moolenaar  call assert_equal("\n\n"
668485be4eSBram Moolenaar        \        .. "!  foo           foobar", execute('abbrev'))
678485be4eSBram Moolenaar
688485be4eSBram Moolenaar  abclear
698485be4eSBram Moolenaar   call assert_equal("\n\nNo abbreviation found", execute('abbrev'))
708485be4eSBram Moolenaar
718485be4eSBram Moolenaar  %bwipe
728485be4eSBram Moolenaarendfunc
738485be4eSBram Moolenaar
742d1a2487SBram Moolenaarfunc Test_map_ctrl_c_insert()
752d1a2487SBram Moolenaar  " mapping of ctrl-c in Insert mode
762d1a2487SBram Moolenaar  set cpo-=< cpo-=k
772d1a2487SBram Moolenaar  inoremap <c-c> <ctrl-c>
782d1a2487SBram Moolenaar  cnoremap <c-c> dummy
792d1a2487SBram Moolenaar  cunmap <c-c>
80fccd93f0SBram Moolenaar  call feedkeys("GoTEST2: CTRL-C |\<*C-C>A|\<Esc>", "xt")
812d1a2487SBram Moolenaar  call assert_equal('TEST2: CTRL-C |<ctrl-c>A|', getline('$'))
822d1a2487SBram Moolenaar  unmap! <c-c>
832d1a2487SBram Moolenaar  set nomodified
842d1a2487SBram Moolenaarendfunc
852d1a2487SBram Moolenaar
862d1a2487SBram Moolenaarfunc Test_map_ctrl_c_visual()
872d1a2487SBram Moolenaar  " mapping of ctrl-c in Visual mode
882d1a2487SBram Moolenaar  vnoremap <c-c> :<C-u>$put ='vmap works'
89fccd93f0SBram Moolenaar  call feedkeys("GV\<*C-C>\<CR>", "xt")
902d1a2487SBram Moolenaar  call assert_equal('vmap works', getline('$'))
912d1a2487SBram Moolenaar  vunmap <c-c>
922d1a2487SBram Moolenaar  set nomodified
932d1a2487SBram Moolenaarendfunc
942d1a2487SBram Moolenaar
952d1a2487SBram Moolenaarfunc Test_map_langmap()
966d91bcb4SBram Moolenaar  CheckFeature langmap
97920694c1SBram Moolenaar
98920694c1SBram Moolenaar  " check langmap applies in normal mode
99920694c1SBram Moolenaar  set langmap=+- nolangremap
100920694c1SBram Moolenaar  new
101920694c1SBram Moolenaar  call setline(1, ['a', 'b', 'c'])
102920694c1SBram Moolenaar  2
103920694c1SBram Moolenaar  call assert_equal('b', getline('.'))
104920694c1SBram Moolenaar  call feedkeys("+", "xt")
105920694c1SBram Moolenaar  call assert_equal('a', getline('.'))
106920694c1SBram Moolenaar
107920694c1SBram Moolenaar  " check no remapping
108920694c1SBram Moolenaar  map x +
109920694c1SBram Moolenaar  2
110920694c1SBram Moolenaar  call feedkeys("x", "xt")
111920694c1SBram Moolenaar  call assert_equal('c', getline('.'))
112920694c1SBram Moolenaar
113920694c1SBram Moolenaar  " check with remapping
114920694c1SBram Moolenaar  set langremap
115920694c1SBram Moolenaar  2
116920694c1SBram Moolenaar  call feedkeys("x", "xt")
117920694c1SBram Moolenaar  call assert_equal('a', getline('.'))
118920694c1SBram Moolenaar
119920694c1SBram Moolenaar  unmap x
120920694c1SBram Moolenaar  bwipe!
121920694c1SBram Moolenaar
122920694c1SBram Moolenaar  " 'langnoremap' follows 'langremap' and vise versa
123920694c1SBram Moolenaar  set langremap
124920694c1SBram Moolenaar  set langnoremap
125920694c1SBram Moolenaar  call assert_equal(0, &langremap)
126920694c1SBram Moolenaar  set langremap
127920694c1SBram Moolenaar  call assert_equal(0, &langnoremap)
128920694c1SBram Moolenaar  set nolangremap
129920694c1SBram Moolenaar  call assert_equal(1, &langnoremap)
130920694c1SBram Moolenaar
131da9ce2cdSBram Moolenaar  " check default values
132da9ce2cdSBram Moolenaar  set langnoremap&
133da9ce2cdSBram Moolenaar  call assert_equal(0, &langnoremap)
134da9ce2cdSBram Moolenaar  call assert_equal(1, &langremap)
135da9ce2cdSBram Moolenaar  set langremap&
136da9ce2cdSBram Moolenaar  call assert_equal(0, &langnoremap)
137da9ce2cdSBram Moolenaar  call assert_equal(1, &langremap)
138da9ce2cdSBram Moolenaar
139920694c1SBram Moolenaar  " langmap should not apply in insert mode, 'langremap' doesn't matter
140920694c1SBram Moolenaar  set langmap=+{ nolangremap
141920694c1SBram Moolenaar  call feedkeys("Go+\<Esc>", "xt")
142920694c1SBram Moolenaar  call assert_equal('+', getline('$'))
143920694c1SBram Moolenaar  set langmap=+{ langremap
1442d1a2487SBram Moolenaar  call feedkeys("Go+\<Esc>", "xt")
1452d1a2487SBram Moolenaar  call assert_equal('+', getline('$'))
1462d1a2487SBram Moolenaar
147920694c1SBram Moolenaar  " langmap used for register name in insert mode.
148920694c1SBram Moolenaar  call setreg('a', 'aaaa')
149920694c1SBram Moolenaar  call setreg('b', 'bbbb')
150920694c1SBram Moolenaar  call setreg('c', 'cccc')
151920694c1SBram Moolenaar  set langmap=ab langremap
152920694c1SBram Moolenaar  call feedkeys("Go\<C-R>a\<Esc>", "xt")
153920694c1SBram Moolenaar  call assert_equal('bbbb', getline('$'))
154920694c1SBram Moolenaar  call feedkeys("Go\<C-R>\<C-R>a\<Esc>", "xt")
155920694c1SBram Moolenaar  call assert_equal('bbbb', getline('$'))
156920694c1SBram Moolenaar  " mapping does not apply
157920694c1SBram Moolenaar  imap c a
158920694c1SBram Moolenaar  call feedkeys("Go\<C-R>c\<Esc>", "xt")
159920694c1SBram Moolenaar  call assert_equal('cccc', getline('$'))
160920694c1SBram Moolenaar  imap a c
161920694c1SBram Moolenaar  call feedkeys("Go\<C-R>a\<Esc>", "xt")
162920694c1SBram Moolenaar  call assert_equal('bbbb', getline('$'))
1632d1a2487SBram Moolenaar
164920694c1SBram Moolenaar  " langmap should not apply in Command-line mode
165920694c1SBram Moolenaar  set langmap=+{ nolangremap
1662d1a2487SBram Moolenaar  call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
1672d1a2487SBram Moolenaar  call assert_equal('+', getline('$'))
1682d1a2487SBram Moolenaar
169e90858d0SBram Moolenaar  iunmap a
170e90858d0SBram Moolenaar  iunmap c
1712d1a2487SBram Moolenaar  set nomodified
1722d1a2487SBram Moolenaarendfunc
1732d1a2487SBram Moolenaar
1742d1a2487SBram Moolenaarfunc Test_map_feedkeys()
1752d1a2487SBram Moolenaar  " issue #212 (feedkeys insert mapping at current position)
1762d1a2487SBram Moolenaar  nnoremap . :call feedkeys(".", "in")<cr>
1772d1a2487SBram Moolenaar  call setline('$', ['a b c d', 'a b c d'])
1782d1a2487SBram Moolenaar  $-1
1792d1a2487SBram Moolenaar  call feedkeys("0qqdw.ifoo\<Esc>qj0@q\<Esc>", "xt")
1802d1a2487SBram Moolenaar  call assert_equal(['fooc d', 'fooc d'], getline(line('$') - 1, line('$')))
181e90858d0SBram Moolenaar  nunmap .
1822d1a2487SBram Moolenaar  set nomodified
1832d1a2487SBram Moolenaarendfunc
1842d1a2487SBram Moolenaar
1852d1a2487SBram Moolenaarfunc Test_map_cursor()
1862d1a2487SBram Moolenaar  " <c-g>U<cursor> works only within a single line
1872d1a2487SBram Moolenaar  imapclear
1882d1a2487SBram Moolenaar  imap ( ()<c-g>U<left>
1892d1a2487SBram Moolenaar  call feedkeys("G2o\<Esc>ki\<CR>Test1: text with a (here some more text\<Esc>k.", "xt")
1902d1a2487SBram Moolenaar  call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 2))
1912d1a2487SBram Moolenaar  call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 1))
1922d1a2487SBram Moolenaar
1932d1a2487SBram Moolenaar  " test undo
1942d1a2487SBram Moolenaar  call feedkeys("G2o\<Esc>ki\<CR>Test2: text wit a (here some more text [und undo]\<C-G>u\<Esc>k.u", "xt")
1952d1a2487SBram Moolenaar  call assert_equal('', getline(line('$') - 2))
1962d1a2487SBram Moolenaar  call assert_equal('Test2: text wit a (here some more text [und undo])', getline(line('$') - 1))
1972d1a2487SBram Moolenaar  set nomodified
1982d1a2487SBram Moolenaar  imapclear
1992d1a2487SBram Moolenaarendfunc
2002d1a2487SBram Moolenaar
20175bf3d22SBram Moolenaarfunc Test_map_cursor_ctrl_gU()
20275bf3d22SBram Moolenaar  " <c-g>U<cursor> works only within a single line
20375bf3d22SBram Moolenaar  nnoremap c<* *Ncgn<C-r>"<C-G>U<S-Left>
20475bf3d22SBram Moolenaar  call setline(1, ['foo', 'foobar', '', 'foo'])
20575bf3d22SBram Moolenaar  call cursor(1,2)
20675bf3d22SBram Moolenaar  call feedkeys("c<*PREFIX\<esc>.", 'xt')
20775bf3d22SBram Moolenaar  call assert_equal(['PREFIXfoo', 'foobar', '', 'PREFIXfoo'], getline(1,'$'))
20875bf3d22SBram Moolenaar  " break undo manually
20975bf3d22SBram Moolenaar  set ul=1000
21075bf3d22SBram Moolenaar  exe ":norm! uu"
21175bf3d22SBram Moolenaar  call assert_equal(['foo', 'foobar', '', 'foo'], getline(1,'$'))
21275bf3d22SBram Moolenaar
21375bf3d22SBram Moolenaar  " Test that it does not work if the cursor moves to the previous line
21475bf3d22SBram Moolenaar  " 2 times <S-Left> move to the previous line
21575bf3d22SBram Moolenaar  nnoremap c<* *Ncgn<C-r>"<C-G>U<S-Left><C-G>U<S-Left>
21675bf3d22SBram Moolenaar  call setline(1, ['', ' foo', 'foobar', '', 'foo'])
21775bf3d22SBram Moolenaar  call cursor(2,3)
21875bf3d22SBram Moolenaar  call feedkeys("c<*PREFIX\<esc>.", 'xt')
21975bf3d22SBram Moolenaar  call assert_equal(['PREFIXPREFIX', ' foo', 'foobar', '', 'foo'], getline(1,'$'))
22075bf3d22SBram Moolenaar  nmapclear
22175bf3d22SBram Moolenaarendfunc
22275bf3d22SBram Moolenaar
22375bf3d22SBram Moolenaar
2242d1a2487SBram Moolenaar" This isn't actually testing a mapping, but similar use of CTRL-G U as above.
2252d1a2487SBram Moolenaarfunc Test_break_undo()
22675bf3d22SBram Moolenaar  set whichwrap=<,>,[,]
2272d1a2487SBram Moolenaar  call feedkeys("G4o2k", "xt")
2282d1a2487SBram Moolenaar  exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line here\<esc>\<up>\<up>."
2292d1a2487SBram Moolenaar  call assert_equal('new line here', getline(line('$') - 3))
2302d1a2487SBram Moolenaar  call assert_equal('Test3: text with a (parenthesis here', getline(line('$') - 2))
2312d1a2487SBram Moolenaar  call assert_equal('new line here', getline(line('$') - 1))
2322d1a2487SBram Moolenaar  set nomodified
2332d1a2487SBram Moolenaarendfunc
23435a4cfa2SBram Moolenaar
23535a4cfa2SBram Moolenaarfunc Test_map_meta_quotes()
23635a4cfa2SBram Moolenaar  imap <M-"> foo
237fccd93f0SBram Moolenaar  call feedkeys("Go-\<*M-\">-\<Esc>", "xt")
23835a4cfa2SBram Moolenaar  call assert_equal("-foo-", getline('$'))
23935a4cfa2SBram Moolenaar  set nomodified
24035a4cfa2SBram Moolenaar  iunmap <M-">
24135a4cfa2SBram Moolenaarendfunc
242878c263aSBram Moolenaar
243c8fd33d1SBram Moolenaarfunc Test_map_meta_multibyte()
244c8fd33d1SBram Moolenaar  imap <M-á> foo
2452f710afeSBram Moolenaar  call assert_match('i  <M-á>\s*foo', execute('imap'))
246c8fd33d1SBram Moolenaar  iunmap <M-á>
247c8fd33d1SBram Moolenaarendfunc
248c8fd33d1SBram Moolenaar
249878c263aSBram Moolenaarfunc Test_abbr_after_line_join()
250878c263aSBram Moolenaar  new
251878c263aSBram Moolenaar  abbr foo bar
252878c263aSBram Moolenaar  set backspace=indent,eol,start
253878c263aSBram Moolenaar  exe "normal o\<BS>foo "
254878c263aSBram Moolenaar  call assert_equal("bar ", getline(1))
255878c263aSBram Moolenaar  bwipe!
256878c263aSBram Moolenaar  unabbr foo
257878c263aSBram Moolenaar  set backspace&
258878c263aSBram Moolenaarendfunc
259b7637c44SBram Moolenaar
260b7637c44SBram Moolenaarfunc Test_map_timeout()
2616d91bcb4SBram Moolenaar  CheckFeature timers
262b7637c44SBram Moolenaar  nnoremap aaaa :let got_aaaa = 1<CR>
263b7637c44SBram Moolenaar  nnoremap bb :let got_bb = 1<CR>
264b7637c44SBram Moolenaar  nmap b aaa
265b7637c44SBram Moolenaar  new
266b7637c44SBram Moolenaar  func ExitInsert(timer)
267b7637c44SBram Moolenaar    let g:line = getline(1)
268b7637c44SBram Moolenaar    call feedkeys("\<Esc>", "t")
269b7637c44SBram Moolenaar  endfunc
270b7637c44SBram Moolenaar  set timeout timeoutlen=200
27126d98218SBram Moolenaar  let timer = timer_start(300, 'ExitInsert')
272b7637c44SBram Moolenaar  " After the 'b' Vim waits for another character to see if it matches 'bb'.
273b7637c44SBram Moolenaar  " When it times out it is expanded to "aaa", but there is no wait for
274b7637c44SBram Moolenaar  " "aaaa".  Can't check that reliably though.
275b7637c44SBram Moolenaar  call feedkeys("b", "xt!")
276b7637c44SBram Moolenaar  call assert_equal("aa", g:line)
277b7637c44SBram Moolenaar  call assert_false(exists('got_aaa'))
278b7637c44SBram Moolenaar  call assert_false(exists('got_bb'))
279b7637c44SBram Moolenaar
280b7637c44SBram Moolenaar  bwipe!
281b7637c44SBram Moolenaar  nunmap aaaa
282b7637c44SBram Moolenaar  nunmap bb
283b7637c44SBram Moolenaar  nunmap b
284b7637c44SBram Moolenaar  set timeoutlen&
285b7637c44SBram Moolenaar  delfunc ExitInsert
28626d98218SBram Moolenaar  call timer_stop(timer)
28726d98218SBram Moolenaarendfunc
28826d98218SBram Moolenaar
28926d98218SBram Moolenaarfunc Test_map_timeout_with_timer_interrupt()
2906d91bcb4SBram Moolenaar  CheckFeature job
2916d91bcb4SBram Moolenaar  CheckFeature timers
292*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
29326d98218SBram Moolenaar
29426d98218SBram Moolenaar  " Confirm the timer invoked in exit_cb of the job doesn't disturb mapped key
29526d98218SBram Moolenaar  " sequence.
29626d98218SBram Moolenaar  new
29726d98218SBram Moolenaar  let g:val = 0
29826d98218SBram Moolenaar  nnoremap \12 :let g:val = 1<CR>
29926d98218SBram Moolenaar  nnoremap \123 :let g:val = 2<CR>
300ea94c855SBram Moolenaar  set timeout timeoutlen=200
30126d98218SBram Moolenaar
30226d98218SBram Moolenaar  func ExitCb(job, status)
3038d4ce56aSBram Moolenaar    let g:timer = timer_start(1, {-> feedkeys("3\<Esc>", 't')})
30426d98218SBram Moolenaar  endfunc
30526d98218SBram Moolenaar
30626d98218SBram Moolenaar  call job_start([&shell, &shellcmdflag, 'echo'], {'exit_cb': 'ExitCb'})
30726d98218SBram Moolenaar  call feedkeys('\12', 'xt!')
30826d98218SBram Moolenaar  call assert_equal(2, g:val)
30926d98218SBram Moolenaar
31026d98218SBram Moolenaar  bwipe!
31126d98218SBram Moolenaar  nunmap \12
31226d98218SBram Moolenaar  nunmap \123
31326d98218SBram Moolenaar  set timeoutlen&
31426d98218SBram Moolenaar  call WaitFor({-> exists('g:timer')})
31526d98218SBram Moolenaar  call timer_stop(g:timer)
31626d98218SBram Moolenaar  unlet g:timer
31726d98218SBram Moolenaar  unlet g:val
31826d98218SBram Moolenaar  delfunc ExitCb
319b7637c44SBram Moolenaarendfunc
320c3c3e698SBram Moolenaar
321c3c3e698SBram Moolenaarfunc Test_abbreviation_CR()
322c3c3e698SBram Moolenaar  new
323c3c3e698SBram Moolenaar  func Eatchar(pat)
324c3c3e698SBram Moolenaar    let c = nr2char(getchar(0))
325c3c3e698SBram Moolenaar    return (c =~ a:pat) ? '' : c
326c3c3e698SBram Moolenaar  endfunc
327c3c3e698SBram Moolenaar  iabbrev <buffer><silent> ~~7 <c-r>=repeat('~', 7)<CR><c-r>=Eatchar('\s')<cr>
328c3c3e698SBram Moolenaar  call feedkeys("GA~~7 \<esc>", 'xt')
329c3c3e698SBram Moolenaar  call assert_equal('~~~~~~~', getline('$'))
330c3c3e698SBram Moolenaar  %d
331c3c3e698SBram Moolenaar  call feedkeys("GA~~7\<cr>\<esc>", 'xt')
332c3c3e698SBram Moolenaar  call assert_equal(['~~~~~~~', ''], getline(1,'$'))
333c3c3e698SBram Moolenaar  delfunc Eatchar
334c3c3e698SBram Moolenaar  bw!
335c3c3e698SBram Moolenaarendfunc
3365e3423d1SBram Moolenaar
3375e3423d1SBram Moolenaarfunc Test_cabbr_visual_mode()
3385e3423d1SBram Moolenaar  cabbr s su
3395e3423d1SBram Moolenaar  call feedkeys(":s \<c-B>\"\<CR>", 'itx')
3405e3423d1SBram Moolenaar  call assert_equal('"su ', getreg(':'))
3415e3423d1SBram Moolenaar  call feedkeys(":'<,'>s \<c-B>\"\<CR>", 'itx')
3425e3423d1SBram Moolenaar  let expected = '"'. "'<,'>su "
3435e3423d1SBram Moolenaar  call assert_equal(expected, getreg(':'))
3445e3423d1SBram Moolenaar  call feedkeys(":  '<,'>s \<c-B>\"\<CR>", 'itx')
3455e3423d1SBram Moolenaar  let expected = '"  '. "'<,'>su "
3465e3423d1SBram Moolenaar  call assert_equal(expected, getreg(':'))
3475e3423d1SBram Moolenaar  call feedkeys(":'a,'bs \<c-B>\"\<CR>", 'itx')
3485e3423d1SBram Moolenaar  let expected = '"'. "'a,'bsu "
3495e3423d1SBram Moolenaar  call assert_equal(expected, getreg(':'))
3505e3423d1SBram Moolenaar  cunabbr s
3515e3423d1SBram Moolenaarendfunc
3525976f8ffSBram Moolenaar
3535976f8ffSBram Moolenaarfunc Test_motionforce_omap()
3545976f8ffSBram Moolenaar  func GetCommand()
3555976f8ffSBram Moolenaar    let g:m=mode(1)
3565976f8ffSBram Moolenaar    let [g:lnum1, g:col1] = searchpos('-', 'Wb')
3575976f8ffSBram Moolenaar    if g:lnum1 == 0
3585976f8ffSBram Moolenaar        return "\<Esc>"
3595976f8ffSBram Moolenaar    endif
3605976f8ffSBram Moolenaar    let [g:lnum2, g:col2] = searchpos('-', 'W')
3615976f8ffSBram Moolenaar    if g:lnum2 == 0
3625976f8ffSBram Moolenaar        return "\<Esc>"
3635976f8ffSBram Moolenaar    endif
3645976f8ffSBram Moolenaar    return ":call Select()\<CR>"
3655976f8ffSBram Moolenaar  endfunc
3665976f8ffSBram Moolenaar  func Select()
3675976f8ffSBram Moolenaar    call cursor([g:lnum1, g:col1])
3685976f8ffSBram Moolenaar    exe "normal! 1 ". (strlen(g:m) == 2 ? 'v' : g:m[2])
3695976f8ffSBram Moolenaar    call cursor([g:lnum2, g:col2])
3705976f8ffSBram Moolenaar    execute "normal! \<BS>"
3715976f8ffSBram Moolenaar  endfunc
3725976f8ffSBram Moolenaar  new
3735976f8ffSBram Moolenaar  onoremap <buffer><expr> i- GetCommand()
3745976f8ffSBram Moolenaar  " 1) default omap mapping
3755976f8ffSBram Moolenaar  %d_
3765976f8ffSBram Moolenaar  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
3775976f8ffSBram Moolenaar  call cursor(2, 1)
3785976f8ffSBram Moolenaar  norm di-
3795976f8ffSBram Moolenaar  call assert_equal('no', g:m)
3805976f8ffSBram Moolenaar  call assert_equal(['aaa -- eee'], getline(1, '$'))
3815976f8ffSBram Moolenaar  " 2) forced characterwise operation
3825976f8ffSBram Moolenaar  %d_
3835976f8ffSBram Moolenaar  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
3845976f8ffSBram Moolenaar  call cursor(2, 1)
3855976f8ffSBram Moolenaar  norm dvi-
3865976f8ffSBram Moolenaar  call assert_equal('nov', g:m)
3875976f8ffSBram Moolenaar  call assert_equal(['aaa -- eee'], getline(1, '$'))
3885976f8ffSBram Moolenaar  " 3) forced linewise operation
3895976f8ffSBram Moolenaar  %d_
3905976f8ffSBram Moolenaar  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
3915976f8ffSBram Moolenaar  call cursor(2, 1)
3925976f8ffSBram Moolenaar  norm dVi-
3935976f8ffSBram Moolenaar  call assert_equal('noV', g:m)
3945976f8ffSBram Moolenaar  call assert_equal([''], getline(1, '$'))
3955976f8ffSBram Moolenaar  " 4) forced blockwise operation
3965976f8ffSBram Moolenaar  %d_
3975976f8ffSBram Moolenaar  call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
3985976f8ffSBram Moolenaar  call cursor(2, 1)
3995976f8ffSBram Moolenaar  exe "norm d\<C-V>i-"
4005976f8ffSBram Moolenaar  call assert_equal("no\<C-V>", g:m)
4015976f8ffSBram Moolenaar  call assert_equal(['aaabbb', 'x', 'dddeee'], getline(1, '$'))
4025976f8ffSBram Moolenaar  bwipe!
4035976f8ffSBram Moolenaar  delfunc Select
4045976f8ffSBram Moolenaar  delfunc GetCommand
4055976f8ffSBram Moolenaarendfunc
4067d491c42SBram Moolenaar
4077d491c42SBram Moolenaarfunc Test_error_in_map_expr()
4088c5a278fSBram Moolenaar  " Unlike CheckRunVimInTerminal this does work in a win32 console
4098c5a278fSBram Moolenaar  CheckFeature terminal
4108c5a278fSBram Moolenaar  if has('win32') && has('gui_running')
4117d491c42SBram Moolenaar    throw 'Skipped: cannot run Vim in a terminal window'
4127d491c42SBram Moolenaar  endif
4137d491c42SBram Moolenaar
4147d491c42SBram Moolenaar  let lines =<< trim [CODE]
4157d491c42SBram Moolenaar  func Func()
4167d491c42SBram Moolenaar    " fail to create list
4177d491c42SBram Moolenaar    let x = [
4187d491c42SBram Moolenaar  endfunc
4197d491c42SBram Moolenaar  nmap <expr> ! Func()
4207d491c42SBram Moolenaar  set updatetime=50
4217d491c42SBram Moolenaar  [CODE]
4227d491c42SBram Moolenaar  call writefile(lines, 'Xtest.vim')
4237d491c42SBram Moolenaar
4240d702028SBram Moolenaar  let buf = term_start(GetVimCommandCleanTerm() .. ' -S Xtest.vim', {'term_rows': 8})
4257d491c42SBram Moolenaar  let job = term_getjob(buf)
4267d491c42SBram Moolenaar  call WaitForAssert({-> assert_notequal('', term_getline(buf, 8))})
4277d491c42SBram Moolenaar
4287d491c42SBram Moolenaar  " GC must not run during map-expr processing, which can make Vim crash.
4297d491c42SBram Moolenaar  call term_sendkeys(buf, '!')
4306a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
4317d491c42SBram Moolenaar  call term_sendkeys(buf, "\<CR>")
4326a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
4337d491c42SBram Moolenaar  call assert_equal('run', job_status(job))
4347d491c42SBram Moolenaar
4357d491c42SBram Moolenaar  call term_sendkeys(buf, ":qall!\<CR>")
4367d491c42SBram Moolenaar  call WaitFor({-> job_status(job) ==# 'dead'})
4377d491c42SBram Moolenaar  if has('unix')
4387d491c42SBram Moolenaar    call assert_equal('', job_info(job).termsig)
4397d491c42SBram Moolenaar  endif
4407d491c42SBram Moolenaar
4417d491c42SBram Moolenaar  call delete('Xtest.vim')
4427d491c42SBram Moolenaar  exe buf .. 'bwipe!'
4437d491c42SBram Moolenaarendfunc
444fafb4b18SBram Moolenaar
445fafb4b18SBram Moolenaarfunc Test_list_mappings()
4462559a478SBram Moolenaar  " Remove default mappings
4472559a478SBram Moolenaar  imapclear
4484f2f61a0SBram Moolenaar
449e3d1f4c9SBram Moolenaar  " reset 'isident' to check it isn't used
450e3d1f4c9SBram Moolenaar  set isident=
451e3d1f4c9SBram Moolenaar  inoremap <C-m> CtrlM
452fafb4b18SBram Moolenaar  inoremap <A-S> AltS
453fafb4b18SBram Moolenaar  inoremap <S-/> ShiftSlash
454e3d1f4c9SBram Moolenaar  set isident&
455fafb4b18SBram Moolenaar  call assert_equal([
456fafb4b18SBram Moolenaar	\ 'i  <S-/>       * ShiftSlash',
457fafb4b18SBram Moolenaar	\ 'i  <M-S>       * AltS',
458fafb4b18SBram Moolenaar	\ 'i  <C-M>       * CtrlM',
459fafb4b18SBram Moolenaar	\], execute('imap')->trim()->split("\n"))
460fafb4b18SBram Moolenaar  iunmap <C-M>
461fafb4b18SBram Moolenaar  iunmap <A-S>
462fafb4b18SBram Moolenaar  call assert_equal(['i  <S-/>       * ShiftSlash'], execute('imap')->trim()->split("\n"))
463fafb4b18SBram Moolenaar  iunmap <S-/>
464fafb4b18SBram Moolenaar  call assert_equal(['No mapping found'], execute('imap')->trim()->split("\n"))
465c2a60ae1SBram Moolenaar
466c2a60ae1SBram Moolenaar  " List global, buffer local and script local mappings
467c2a60ae1SBram Moolenaar  nmap ,f /^\k\+ (<CR>
468c2a60ae1SBram Moolenaar  nmap <buffer> ,f /^\k\+ (<CR>
469c2a60ae1SBram Moolenaar  nmap <script> ,fs /^\k\+ (<CR>
470c2a60ae1SBram Moolenaar  call assert_equal(['n  ,f           @/^\k\+ (<CR>',
471c2a60ae1SBram Moolenaar        \ 'n  ,fs         & /^\k\+ (<CR>',
472c2a60ae1SBram Moolenaar        \ 'n  ,f            /^\k\+ (<CR>'],
473c2a60ae1SBram Moolenaar        \ execute('nmap ,f')->trim()->split("\n"))
474c2a60ae1SBram Moolenaar
475c2a60ae1SBram Moolenaar  " List <Nop> mapping
476c2a60ae1SBram Moolenaar  nmap ,n <Nop>
477c2a60ae1SBram Moolenaar  call assert_equal(['n  ,n            <Nop>'],
478c2a60ae1SBram Moolenaar        \ execute('nmap ,n')->trim()->split("\n"))
479c2a60ae1SBram Moolenaar
4807f51bbe0SBram Moolenaar  " verbose map
4817f51bbe0SBram Moolenaar  call assert_match("\tLast set from .*/test_mapping.vim line \\d\\+$",
4827f51bbe0SBram Moolenaar        \ execute('verbose map ,n')->trim()->split("\n")[1])
4837f51bbe0SBram Moolenaar
4847f51bbe0SBram Moolenaar  " map to CTRL-V
4857f51bbe0SBram Moolenaar  exe "nmap ,k \<C-V>"
4867f51bbe0SBram Moolenaar  call assert_equal(['n  ,k            <Nop>'],
4877f51bbe0SBram Moolenaar        \ execute('nmap ,k')->trim()->split("\n"))
4887f51bbe0SBram Moolenaar
4892d6d718dSYegappan Lakshmanan  " map with space at the beginning
4902d6d718dSYegappan Lakshmanan  exe "nmap \<C-V> w <Nop>"
4912d6d718dSYegappan Lakshmanan  call assert_equal(['n  <Space>w      <Nop>'],
4922d6d718dSYegappan Lakshmanan        \ execute("nmap \<C-V> w")->trim()->split("\n"))
4932d6d718dSYegappan Lakshmanan
494c2a60ae1SBram Moolenaar  nmapclear
495fafb4b18SBram Moolenaarendfunc
4964ebe0e62SBram Moolenaar
49718b7d86dSBram Moolenaarfunc Test_expr_map_gets_cursor()
49818b7d86dSBram Moolenaar  new
49918b7d86dSBram Moolenaar  call setline(1, ['one', 'some w!rd'])
50018b7d86dSBram Moolenaar  func StoreColumn()
50118b7d86dSBram Moolenaar    let g:exprLine = line('.')
50218b7d86dSBram Moolenaar    let g:exprCol = col('.')
50318b7d86dSBram Moolenaar    return 'x'
50418b7d86dSBram Moolenaar  endfunc
50518b7d86dSBram Moolenaar  nnoremap <expr> x StoreColumn()
50618b7d86dSBram Moolenaar  2
50718b7d86dSBram Moolenaar  nmap ! f!<Ignore>x
50818b7d86dSBram Moolenaar  call feedkeys("!", 'xt')
50918b7d86dSBram Moolenaar  call assert_equal('some wrd', getline(2))
51018b7d86dSBram Moolenaar  call assert_equal(2, g:exprLine)
51118b7d86dSBram Moolenaar  call assert_equal(7, g:exprCol)
51218b7d86dSBram Moolenaar
51318b7d86dSBram Moolenaar  bwipe!
51418b7d86dSBram Moolenaar  unlet g:exprLine
51518b7d86dSBram Moolenaar  unlet g:exprCol
5166ccfd99bSBram Moolenaar  delfunc StoreColumn
51718b7d86dSBram Moolenaar  nunmap x
51818b7d86dSBram Moolenaar  nunmap !
51918b7d86dSBram Moolenaarendfunc
52018b7d86dSBram Moolenaar
5214ebe0e62SBram Moolenaarfunc Test_expr_map_restore_cursor()
5224ebe0e62SBram Moolenaar  CheckScreendump
5234ebe0e62SBram Moolenaar
5244ebe0e62SBram Moolenaar  let lines =<< trim END
5254ebe0e62SBram Moolenaar      call setline(1, ['one', 'two', 'three'])
5264ebe0e62SBram Moolenaar      2
5274ebe0e62SBram Moolenaar      set ls=2
5284ebe0e62SBram Moolenaar      hi! link StatusLine ErrorMsg
5294ebe0e62SBram Moolenaar      noremap <expr> <C-B> Func()
5304ebe0e62SBram Moolenaar      func Func()
5314ebe0e62SBram Moolenaar	  let g:on = !get(g:, 'on', 0)
5324ebe0e62SBram Moolenaar	  redraws
5334ebe0e62SBram Moolenaar	  return ''
5344ebe0e62SBram Moolenaar      endfunc
5354ebe0e62SBram Moolenaar      func Status()
5364ebe0e62SBram Moolenaar	  return get(g:, 'on', 0) ? '[on]' : ''
5374ebe0e62SBram Moolenaar      endfunc
5384ebe0e62SBram Moolenaar      set stl=%{Status()}
5394ebe0e62SBram Moolenaar  END
5404ebe0e62SBram Moolenaar  call writefile(lines, 'XtestExprMap')
5414ebe0e62SBram Moolenaar  let buf = RunVimInTerminal('-S XtestExprMap', #{rows: 10})
5426a2c5a7dSBram Moolenaar  call TermWait(buf)
5434ebe0e62SBram Moolenaar  call term_sendkeys(buf, "\<C-B>")
5444ebe0e62SBram Moolenaar  call VerifyScreenDump(buf, 'Test_map_expr_1', {})
5454ebe0e62SBram Moolenaar
5464ebe0e62SBram Moolenaar  " clean up
5474ebe0e62SBram Moolenaar  call StopVimInTerminal(buf)
5484ebe0e62SBram Moolenaar  call delete('XtestExprMap')
5494ebe0e62SBram Moolenaarendfunc
5508ba6bb7cSBram Moolenaar
5518ba6bb7cSBram Moolenaar" Test for mapping errors
5528ba6bb7cSBram Moolenaarfunc Test_map_error()
5538ba6bb7cSBram Moolenaar  call assert_fails('unmap', 'E474:')
5548ba6bb7cSBram Moolenaar  call assert_fails("exe 'map ' .. repeat('a', 51) .. ' :ls'", 'E474:')
5558ba6bb7cSBram Moolenaar  call assert_fails('unmap abc', 'E31:')
5568ba6bb7cSBram Moolenaar  call assert_fails('unabbr abc', 'E24:')
5578ba6bb7cSBram Moolenaar  call assert_equal('', maparg(''))
5588ba6bb7cSBram Moolenaar  call assert_fails('echo maparg("abc", [])', 'E730:')
5598ba6bb7cSBram Moolenaar
5608ba6bb7cSBram Moolenaar  " unique map
5618ba6bb7cSBram Moolenaar  map ,w /[#&!]<CR>
5628ba6bb7cSBram Moolenaar  call assert_fails("map <unique> ,w /[#&!]<CR>", 'E227:')
5638ba6bb7cSBram Moolenaar  " unique buffer-local map
5648ba6bb7cSBram Moolenaar  call assert_fails("map <buffer> <unique> ,w /[.,;]<CR>", 'E225:')
5658ba6bb7cSBram Moolenaar  unmap ,w
5668ba6bb7cSBram Moolenaar
5678ba6bb7cSBram Moolenaar  " unique abbreviation
5688ba6bb7cSBram Moolenaar  abbr SP special
5698ba6bb7cSBram Moolenaar  call assert_fails("abbr <unique> SP special", 'E226:')
5708ba6bb7cSBram Moolenaar  " unique buffer-local map
5718ba6bb7cSBram Moolenaar  call assert_fails("abbr <buffer> <unique> SP special", 'E224:')
5728ba6bb7cSBram Moolenaar  unabbr SP
5738ba6bb7cSBram Moolenaar
5748ba6bb7cSBram Moolenaar  call assert_fails('mapclear abc', 'E474:')
5758ba6bb7cSBram Moolenaar  call assert_fails('abclear abc', 'E474:')
576c2a60ae1SBram Moolenaar  call assert_fails('abbr $xyz abc', 'E474:')
577c2a60ae1SBram Moolenaar
578c2a60ae1SBram Moolenaar  " space character in an abbreviation
579c2a60ae1SBram Moolenaar  call assert_fails('abbr ab<space> ABC', 'E474:')
580c2a60ae1SBram Moolenaar
581c2a60ae1SBram Moolenaar  " invalid <expr> map
582c2a60ae1SBram Moolenaar  map <expr> ,f abc
583c2a60ae1SBram Moolenaar  call assert_fails('normal ,f', 'E121:')
584c2a60ae1SBram Moolenaar  unmap <expr> ,f
5859f6277bdSBram Moolenaar
5869f6277bdSBram Moolenaar  " Recursive use of :normal in a map
5879f6277bdSBram Moolenaar  set maxmapdepth=100
5889f6277bdSBram Moolenaar  map gq :normal gq<CR>
5899f6277bdSBram Moolenaar  call assert_fails('normal gq', 'E192:')
5909f6277bdSBram Moolenaar  unmap gq
5919f6277bdSBram Moolenaar  set maxmapdepth&
5928ba6bb7cSBram Moolenaarendfunc
5938ba6bb7cSBram Moolenaar
5948ba6bb7cSBram Moolenaar" Test for <special> key mapping
5958ba6bb7cSBram Moolenaarfunc Test_map_special()
5968ba6bb7cSBram Moolenaar  new
5978ba6bb7cSBram Moolenaar  let old_cpo = &cpo
5988ba6bb7cSBram Moolenaar  set cpo+=<
5998ba6bb7cSBram Moolenaar  imap <F12> Blue
6008ba6bb7cSBram Moolenaar  call feedkeys("i\<F12>", "x")
6018ba6bb7cSBram Moolenaar  call assert_equal("<F12>", getline(1))
6028ba6bb7cSBram Moolenaar  call feedkeys("ddi<F12>", "x")
6038ba6bb7cSBram Moolenaar  call assert_equal("Blue", getline(1))
6048ba6bb7cSBram Moolenaar  iunmap <F12>
6058ba6bb7cSBram Moolenaar  imap <special> <F12> Green
6068ba6bb7cSBram Moolenaar  call feedkeys("ddi\<F12>", "x")
6078ba6bb7cSBram Moolenaar  call assert_equal("Green", getline(1))
6088ba6bb7cSBram Moolenaar  call feedkeys("ddi<F12>", "x")
6098ba6bb7cSBram Moolenaar  call assert_equal("<F12>", getline(1))
6108ba6bb7cSBram Moolenaar  iunmap <special> <F12>
6118ba6bb7cSBram Moolenaar  let &cpo = old_cpo
6128ba6bb7cSBram Moolenaar  %bwipe!
6138ba6bb7cSBram Moolenaarendfunc
6148ba6bb7cSBram Moolenaar
6158ba6bb7cSBram Moolenaar" Test for hasmapto()
6168ba6bb7cSBram Moolenaarfunc Test_hasmapto()
6178ba6bb7cSBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ ('))
618c2a60ae1SBram Moolenaar  map ,f /^\k\+ (<CR>
619c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ ('))
620c2a60ae1SBram Moolenaar  unmap ,f
621c2a60ae1SBram Moolenaar
622c2a60ae1SBram Moolenaar  " Insert mode mapping
623c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'i'))
624c2a60ae1SBram Moolenaar  imap ,f /^\k\+ (<CR>
625c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'i'))
626c2a60ae1SBram Moolenaar  iunmap ,f
627c2a60ae1SBram Moolenaar
628c2a60ae1SBram Moolenaar  " Normal mode mapping
6298ba6bb7cSBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'n'))
6308ba6bb7cSBram Moolenaar  nmap ,f /^\k\+ (<CR>
6318ba6bb7cSBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ ('))
6328ba6bb7cSBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'n'))
633c2a60ae1SBram Moolenaar  nunmap ,f
634c2a60ae1SBram Moolenaar
635c2a60ae1SBram Moolenaar  " Visual and Select mode mapping
6368ba6bb7cSBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'v'))
637c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'x'))
638c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 's'))
639c2a60ae1SBram Moolenaar  vmap ,f /^\k\+ (<CR>
640c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'v'))
641c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'x'))
642c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 's'))
643c2a60ae1SBram Moolenaar  vunmap ,f
644c2a60ae1SBram Moolenaar
645c2a60ae1SBram Moolenaar  " Visual mode mapping
646c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'x'))
647c2a60ae1SBram Moolenaar  xmap ,f /^\k\+ (<CR>
648c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'v'))
649c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'x'))
650c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 's'))
651c2a60ae1SBram Moolenaar  xunmap ,f
652c2a60ae1SBram Moolenaar
653c2a60ae1SBram Moolenaar  " Select mode mapping
654c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 's'))
655c2a60ae1SBram Moolenaar  smap ,f /^\k\+ (<CR>
656c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'v'))
657c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'x'))
658c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 's'))
659c2a60ae1SBram Moolenaar  sunmap ,f
660c2a60ae1SBram Moolenaar
661c2a60ae1SBram Moolenaar  " Operator-pending mode mapping
662c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'o'))
663c2a60ae1SBram Moolenaar  omap ,f /^\k\+ (<CR>
664c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'o'))
665c2a60ae1SBram Moolenaar  ounmap ,f
666c2a60ae1SBram Moolenaar
667c2a60ae1SBram Moolenaar  " Language mapping
668c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'l'))
669c2a60ae1SBram Moolenaar  lmap ,f /^\k\+ (<CR>
670c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'l'))
671c2a60ae1SBram Moolenaar  lunmap ,f
672c2a60ae1SBram Moolenaar
673c2a60ae1SBram Moolenaar  " Cmdline mode mapping
674c2a60ae1SBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'c'))
675c2a60ae1SBram Moolenaar  cmap ,f /^\k\+ (<CR>
676c2a60ae1SBram Moolenaar  call assert_equal(1, hasmapto('/^\k\+ (', 'c'))
677c2a60ae1SBram Moolenaar  cunmap ,f
6788ba6bb7cSBram Moolenaar
6798ba6bb7cSBram Moolenaar  call assert_equal(0, hasmapto('/^\k\+ (', 'n', 1))
6808ba6bb7cSBram Moolenaarendfunc
6818ba6bb7cSBram Moolenaar
6828ba6bb7cSBram Moolenaar" Test for command-line completion of maps
6838ba6bb7cSBram Moolenaarfunc Test_mapcomplete()
6848ba6bb7cSBram Moolenaar  call assert_equal(['<buffer>', '<expr>', '<nowait>', '<script>',
6858ba6bb7cSBram Moolenaar	      \ '<silent>', '<special>', '<unique>'],
6868ba6bb7cSBram Moolenaar	      \ getcompletion('', 'mapping'))
6878ba6bb7cSBram Moolenaar  call assert_equal([], getcompletion(',d', 'mapping'))
6888ba6bb7cSBram Moolenaar
689c2a60ae1SBram Moolenaar  call feedkeys(":unmap <buf\<C-A>\<C-B>\"\<CR>", 'tx')
690c2a60ae1SBram Moolenaar  call assert_equal('"unmap <buffer>', @:)
691c2a60ae1SBram Moolenaar
692c2a60ae1SBram Moolenaar  call feedkeys(":unabbr <buf\<C-A>\<C-B>\"\<CR>", 'tx')
693c2a60ae1SBram Moolenaar  call assert_equal('"unabbr <buffer>', @:)
694c2a60ae1SBram Moolenaar
6958ba6bb7cSBram Moolenaar  call feedkeys(":abbr! \<C-A>\<C-B>\"\<CR>", 'tx')
696c2a60ae1SBram Moolenaar  call assert_equal("\"abbr! \x01", @:)
697c2a60ae1SBram Moolenaar
698c2a60ae1SBram Moolenaar  " Multiple matches for a map
699c2a60ae1SBram Moolenaar  nmap ,f /H<CR>
700c2a60ae1SBram Moolenaar  omap ,f /H<CR>
701c2a60ae1SBram Moolenaar  call feedkeys(":map ,\<C-A>\<C-B>\"\<CR>", 'tx')
702c2a60ae1SBram Moolenaar  call assert_equal('"map ,f', @:)
703c2a60ae1SBram Moolenaar  mapclear
704c2a60ae1SBram Moolenaarendfunc
705c2a60ae1SBram Moolenaar
706c2a60ae1SBram Moolenaar" Test for <expr> in abbreviation
707c2a60ae1SBram Moolenaarfunc Test_expr_abbr()
708c2a60ae1SBram Moolenaar  new
709c2a60ae1SBram Moolenaar  iabbr <expr> teh "the"
710c2a60ae1SBram Moolenaar  call feedkeys("iteh ", "tx")
711c2a60ae1SBram Moolenaar  call assert_equal('the ', getline(1))
712c2a60ae1SBram Moolenaar  iabclear
713c2a60ae1SBram Moolenaar  call setline(1, '')
714c2a60ae1SBram Moolenaar
715c2a60ae1SBram Moolenaar  " invalid <expr> abbreviation
716c2a60ae1SBram Moolenaar  abbr <expr> hte GetAbbr()
717c2a60ae1SBram Moolenaar  call assert_fails('normal ihte ', 'E117:')
718c2a60ae1SBram Moolenaar  call assert_equal('', getline(1))
719c2a60ae1SBram Moolenaar  unabbr <expr> hte
720c2a60ae1SBram Moolenaar
721c2a60ae1SBram Moolenaar  close!
722c2a60ae1SBram Moolenaarendfunc
723c2a60ae1SBram Moolenaar
724c2a60ae1SBram Moolenaar" Test for storing mappings in different modes in a vimrc file
725c2a60ae1SBram Moolenaarfunc Test_mkvimrc_mapmodes()
726c2a60ae1SBram Moolenaar  map a1 /a1
727c2a60ae1SBram Moolenaar  nmap a2 /a2
728c2a60ae1SBram Moolenaar  vmap a3 /a3
729c2a60ae1SBram Moolenaar  smap a4 /a4
730c2a60ae1SBram Moolenaar  xmap a5 /a5
731c2a60ae1SBram Moolenaar  omap a6 /a6
732c2a60ae1SBram Moolenaar  map! a7 /a7
733c2a60ae1SBram Moolenaar  imap a8 /a8
734c2a60ae1SBram Moolenaar  lmap a9 /a9
735c2a60ae1SBram Moolenaar  cmap a10 /a10
736c2a60ae1SBram Moolenaar  tmap a11 /a11
737c2a60ae1SBram Moolenaar  " Normal + Visual map
738c2a60ae1SBram Moolenaar  map a12 /a12
739c2a60ae1SBram Moolenaar  sunmap a12
740c2a60ae1SBram Moolenaar  ounmap a12
741c2a60ae1SBram Moolenaar  " Normal + Selectmode map
742c2a60ae1SBram Moolenaar  map a13 /a13
743c2a60ae1SBram Moolenaar  xunmap a13
744c2a60ae1SBram Moolenaar  ounmap a13
745c2a60ae1SBram Moolenaar  " Normal + OpPending map
746c2a60ae1SBram Moolenaar  map a14 /a14
747c2a60ae1SBram Moolenaar  vunmap a14
748c2a60ae1SBram Moolenaar  " Visual + Selectmode map
749c2a60ae1SBram Moolenaar  map a15 /a15
750c2a60ae1SBram Moolenaar  nunmap a15
751c2a60ae1SBram Moolenaar  ounmap a15
752c2a60ae1SBram Moolenaar  " Visual + OpPending map
753c2a60ae1SBram Moolenaar  map a16 /a16
754c2a60ae1SBram Moolenaar  nunmap a16
755c2a60ae1SBram Moolenaar  sunmap a16
756c2a60ae1SBram Moolenaar  " Selectmode + OpPending map
757c2a60ae1SBram Moolenaar  map a17 /a17
758c2a60ae1SBram Moolenaar  nunmap a17
759c2a60ae1SBram Moolenaar  xunmap a17
760c2a60ae1SBram Moolenaar  " Normal + Visual + Selectmode map
761c2a60ae1SBram Moolenaar  map a18 /a18
762c2a60ae1SBram Moolenaar  ounmap a18
763c2a60ae1SBram Moolenaar  " Normal + Visual + OpPending map
764c2a60ae1SBram Moolenaar  map a19 /a19
765c2a60ae1SBram Moolenaar  sunmap a19
766c2a60ae1SBram Moolenaar  " Normal + Selectmode + OpPending map
767c2a60ae1SBram Moolenaar  map a20 /a20
768c2a60ae1SBram Moolenaar  xunmap a20
769c2a60ae1SBram Moolenaar  " Visual + Selectmode + OpPending map
770c2a60ae1SBram Moolenaar  map a21 /a21
771c2a60ae1SBram Moolenaar  nunmap a21
772c2a60ae1SBram Moolenaar  " Mapping to Nop
773c2a60ae1SBram Moolenaar  map a22 <Nop>
774c2a60ae1SBram Moolenaar  " Script local mapping
775c2a60ae1SBram Moolenaar  map <script> a23 /a23
776c2a60ae1SBram Moolenaar
777c2a60ae1SBram Moolenaar  " Newline in {lhs} and {rhs} of a map
778c2a60ae1SBram Moolenaar  exe "map a24\<C-V>\<C-J> ia24\<C-V>\<C-J><Esc>"
779c2a60ae1SBram Moolenaar
780c2a60ae1SBram Moolenaar  " Abbreviation
781c2a60ae1SBram Moolenaar  abbr a25 A25
782c2a60ae1SBram Moolenaar  cabbr a26 A26
783c2a60ae1SBram Moolenaar  iabbr a27 A27
784c2a60ae1SBram Moolenaar
785c2a60ae1SBram Moolenaar  mkvimrc! Xvimrc
786c2a60ae1SBram Moolenaar  let l = readfile('Xvimrc')
787c2a60ae1SBram Moolenaar  call assert_equal(['map a1 /a1'], filter(copy(l), 'v:val =~ " a1 "'))
788c2a60ae1SBram Moolenaar  call assert_equal(['nmap a2 /a2'], filter(copy(l), 'v:val =~ " a2 "'))
789c2a60ae1SBram Moolenaar  call assert_equal(['vmap a3 /a3'], filter(copy(l), 'v:val =~ " a3 "'))
790c2a60ae1SBram Moolenaar  call assert_equal(['smap a4 /a4'], filter(copy(l), 'v:val =~ " a4 "'))
791c2a60ae1SBram Moolenaar  call assert_equal(['xmap a5 /a5'], filter(copy(l), 'v:val =~ " a5 "'))
792c2a60ae1SBram Moolenaar  call assert_equal(['omap a6 /a6'], filter(copy(l), 'v:val =~ " a6 "'))
793c2a60ae1SBram Moolenaar  call assert_equal(['map! a7 /a7'], filter(copy(l), 'v:val =~ " a7 "'))
794c2a60ae1SBram Moolenaar  call assert_equal(['imap a8 /a8'], filter(copy(l), 'v:val =~ " a8 "'))
795c2a60ae1SBram Moolenaar  call assert_equal(['lmap a9 /a9'], filter(copy(l), 'v:val =~ " a9 "'))
796c2a60ae1SBram Moolenaar  call assert_equal(['cmap a10 /a10'], filter(copy(l), 'v:val =~ " a10 "'))
797c2a60ae1SBram Moolenaar  call assert_equal(['tmap a11 /a11'], filter(copy(l), 'v:val =~ " a11 "'))
798c2a60ae1SBram Moolenaar  call assert_equal(['nmap a12 /a12', 'xmap a12 /a12'],
799c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a12 "'))
800c2a60ae1SBram Moolenaar  call assert_equal(['nmap a13 /a13', 'smap a13 /a13'],
801c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a13 "'))
802c2a60ae1SBram Moolenaar  call assert_equal(['nmap a14 /a14', 'omap a14 /a14'],
803c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a14 "'))
804c2a60ae1SBram Moolenaar  call assert_equal(['vmap a15 /a15'], filter(copy(l), 'v:val =~ " a15 "'))
805c2a60ae1SBram Moolenaar  call assert_equal(['xmap a16 /a16', 'omap a16 /a16'],
806c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a16 "'))
807c2a60ae1SBram Moolenaar  call assert_equal(['smap a17 /a17', 'omap a17 /a17'],
808c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a17 "'))
809c2a60ae1SBram Moolenaar  call assert_equal(['nmap a18 /a18', 'vmap a18 /a18'],
810c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a18 "'))
811c2a60ae1SBram Moolenaar  call assert_equal(['nmap a19 /a19', 'xmap a19 /a19', 'omap a19 /a19'],
812c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a19 "'))
813c2a60ae1SBram Moolenaar  call assert_equal(['nmap a20 /a20', 'smap a20 /a20', 'omap a20 /a20'],
814c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a20 "'))
815c2a60ae1SBram Moolenaar  call assert_equal(['vmap a21 /a21', 'omap a21 /a21'],
816c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a21 "'))
817c2a60ae1SBram Moolenaar  call assert_equal(['map a22 <Nop>'], filter(copy(l), 'v:val =~ " a22 "'))
818c2a60ae1SBram Moolenaar  call assert_equal([], filter(copy(l), 'v:val =~ " a23 "'))
819c2a60ae1SBram Moolenaar  call assert_equal(["map a24<NL> ia24<NL>\x16\e"],
820c2a60ae1SBram Moolenaar        \ filter(copy(l), 'v:val =~ " a24"'))
821c2a60ae1SBram Moolenaar
822c2a60ae1SBram Moolenaar  call assert_equal(['abbr a25 A25'], filter(copy(l), 'v:val =~ " a25 "'))
823c2a60ae1SBram Moolenaar  call assert_equal(['cabbr a26 A26'], filter(copy(l), 'v:val =~ " a26 "'))
824c2a60ae1SBram Moolenaar  call assert_equal(['iabbr a27 A27'], filter(copy(l), 'v:val =~ " a27 "'))
825c2a60ae1SBram Moolenaar  call delete('Xvimrc')
826c2a60ae1SBram Moolenaar
827c2a60ae1SBram Moolenaar  mapclear
828c2a60ae1SBram Moolenaar  nmapclear
829c2a60ae1SBram Moolenaar  vmapclear
830c2a60ae1SBram Moolenaar  xmapclear
831c2a60ae1SBram Moolenaar  smapclear
832c2a60ae1SBram Moolenaar  omapclear
833c2a60ae1SBram Moolenaar  imapclear
834c2a60ae1SBram Moolenaar  lmapclear
835c2a60ae1SBram Moolenaar  cmapclear
836c2a60ae1SBram Moolenaar  tmapclear
837c2a60ae1SBram Moolenaarendfunc
838c2a60ae1SBram Moolenaar
839c2a60ae1SBram Moolenaar" Test for recursive mapping ('maxmapdepth')
840c2a60ae1SBram Moolenaarfunc Test_map_recursive()
841c2a60ae1SBram Moolenaar  map x y
842c2a60ae1SBram Moolenaar  map y x
843c2a60ae1SBram Moolenaar  call assert_fails('normal x', 'E223:')
844c2a60ae1SBram Moolenaar  unmap x
845c2a60ae1SBram Moolenaar  unmap y
846c2a60ae1SBram Moolenaarendfunc
847c2a60ae1SBram Moolenaar
848c2a60ae1SBram Moolenaar" Test for removing an abbreviation using {rhs} and with space after {lhs}
849c2a60ae1SBram Moolenaarfunc Test_abbr_remove()
850c2a60ae1SBram Moolenaar  abbr foo bar
851c2a60ae1SBram Moolenaar  let d = maparg('foo', 'i', 1, 1)
852c2a60ae1SBram Moolenaar  call assert_equal(['foo', 'bar', '!'], [d.lhs, d.rhs, d.mode])
853c2a60ae1SBram Moolenaar  unabbr bar
854c2a60ae1SBram Moolenaar  call assert_equal({}, maparg('foo', 'i', 1, 1))
855c2a60ae1SBram Moolenaar
856c2a60ae1SBram Moolenaar  abbr foo bar
857c2a60ae1SBram Moolenaar  unabbr foo<space><tab>
858c2a60ae1SBram Moolenaar  call assert_equal({}, maparg('foo', 'i', 1, 1))
8598ba6bb7cSBram Moolenaarendfunc
8608ba6bb7cSBram Moolenaar
8617f51bbe0SBram Moolenaar" Trigger an abbreviation using a special key
8627f51bbe0SBram Moolenaarfunc Test_abbr_trigger_special()
8637f51bbe0SBram Moolenaar  new
8647f51bbe0SBram Moolenaar  iabbr teh the
8657f51bbe0SBram Moolenaar  call feedkeys("iteh\<F2>\<Esc>", 'xt')
8667f51bbe0SBram Moolenaar  call assert_equal('the<F2>', getline(1))
8677f51bbe0SBram Moolenaar  iunab teh
8687f51bbe0SBram Moolenaar  close!
8697f51bbe0SBram Moolenaarendfunc
8707f51bbe0SBram Moolenaar
8717f51bbe0SBram Moolenaar" Test for '<' in 'cpoptions'
8727f51bbe0SBram Moolenaarfunc Test_map_cpo_special_keycode()
8737f51bbe0SBram Moolenaar  set cpo-=<
8747f51bbe0SBram Moolenaar  imap x<Bslash>k Test
8757f51bbe0SBram Moolenaar  let d = maparg('x<Bslash>k', 'i', 0, 1)
8767f51bbe0SBram Moolenaar  call assert_equal(['x\k', 'Test', 'i'], [d.lhs, d.rhs, d.mode])
8777f51bbe0SBram Moolenaar  call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx')
8787f51bbe0SBram Moolenaar  call assert_equal('"imap x\k', @:)
8797f51bbe0SBram Moolenaar  iunmap x<Bslash>k
8807f51bbe0SBram Moolenaar  set cpo+=<
8817f51bbe0SBram Moolenaar  imap x<Bslash>k Test
8827f51bbe0SBram Moolenaar  let d = maparg('x<Bslash>k', 'i', 0, 1)
8837f51bbe0SBram Moolenaar  call assert_equal(['x<Bslash>k', 'Test', 'i'], [d.lhs, d.rhs, d.mode])
8847f51bbe0SBram Moolenaar  call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx')
8857f51bbe0SBram Moolenaar  call assert_equal('"imap x<Bslash>k', @:)
8867f51bbe0SBram Moolenaar  iunmap x<Bslash>k
8877f51bbe0SBram Moolenaar  set cpo-=<
8887f51bbe0SBram Moolenaar  " Modifying 'cpo' above adds some default mappings, remove them
8897f51bbe0SBram Moolenaar  mapclear
8907f51bbe0SBram Moolenaar  mapclear!
8917f51bbe0SBram Moolenaarendfunc
8927f51bbe0SBram Moolenaar
893957cf67dSBram Moolenaar" Test for <Cmd> key in maps to execute commands
894957cf67dSBram Moolenaarfunc Test_map_cmdkey()
895957cf67dSBram Moolenaar  new
896957cf67dSBram Moolenaar
897957cf67dSBram Moolenaar  " Error cases
898957cf67dSBram Moolenaar  let x = 0
899957cf67dSBram Moolenaar  noremap <F3> <Cmd><Cmd>let x = 1<CR>
900957cf67dSBram Moolenaar  call assert_fails('call feedkeys("\<F3>", "xt")', 'E1136:')
901957cf67dSBram Moolenaar  call assert_equal(0, x)
902957cf67dSBram Moolenaar
903957cf67dSBram Moolenaar  noremap <F3> <Cmd><F3>let x = 2<CR>
904957cf67dSBram Moolenaar  call assert_fails('call feedkeys("\<F3>", "xt")', 'E1137:')
905957cf67dSBram Moolenaar  call assert_equal(0, x)
906957cf67dSBram Moolenaar
907957cf67dSBram Moolenaar  noremap <F3> <Cmd>let x = 3
908957cf67dSBram Moolenaar  call assert_fails('call feedkeys("\<F3>", "xt!")', 'E1135:')
909957cf67dSBram Moolenaar  call assert_equal(0, x)
910957cf67dSBram Moolenaar
911957cf67dSBram Moolenaar  " works in various modes and sees the correct mode()
912957cf67dSBram Moolenaar  noremap <F3> <Cmd>let m = mode(1)<CR>
913957cf67dSBram Moolenaar  noremap! <F3> <Cmd>let m = mode(1)<CR>
914957cf67dSBram Moolenaar
915957cf67dSBram Moolenaar  " normal mode
916957cf67dSBram Moolenaar  call feedkeys("\<F3>", 'xt')
917957cf67dSBram Moolenaar  call assert_equal('n', m)
918957cf67dSBram Moolenaar
919957cf67dSBram Moolenaar  " visual mode
920957cf67dSBram Moolenaar  call feedkeys("v\<F3>", 'xt!')
921957cf67dSBram Moolenaar  call assert_equal('v', m)
922957cf67dSBram Moolenaar  " shouldn't leave the visual mode
923957cf67dSBram Moolenaar  call assert_equal('v', mode(1))
924957cf67dSBram Moolenaar  call feedkeys("\<Esc>", 'xt')
925957cf67dSBram Moolenaar  call assert_equal('n', mode(1))
926957cf67dSBram Moolenaar
927957cf67dSBram Moolenaar  " visual mapping in select mode
928957cf67dSBram Moolenaar  call feedkeys("gh\<F3>", 'xt!')
929957cf67dSBram Moolenaar  call assert_equal('v', m)
930957cf67dSBram Moolenaar  " shouldn't leave select mode
931957cf67dSBram Moolenaar  call assert_equal('s', mode(1))
932957cf67dSBram Moolenaar  call feedkeys("\<Esc>", 'xt')
933957cf67dSBram Moolenaar  call assert_equal('n', mode(1))
934957cf67dSBram Moolenaar
935957cf67dSBram Moolenaar  " select mode mapping
936957cf67dSBram Moolenaar  snoremap <F3> <Cmd>let m = mode(1)<cr>
937957cf67dSBram Moolenaar  call feedkeys("gh\<F3>", 'xt!')
938957cf67dSBram Moolenaar  call assert_equal('s', m)
939957cf67dSBram Moolenaar  " shouldn't leave select mode
940957cf67dSBram Moolenaar  call assert_equal('s', mode(1))
941957cf67dSBram Moolenaar  call feedkeys("\<Esc>", 'xt')
942957cf67dSBram Moolenaar  call assert_equal('n', mode(1))
943957cf67dSBram Moolenaar
944957cf67dSBram Moolenaar  " operator-pending mode
945957cf67dSBram Moolenaar  call feedkeys("d\<F3>", 'xt!')
946957cf67dSBram Moolenaar  call assert_equal('no', m)
947957cf67dSBram Moolenaar  " leaves the operator-pending mode
948957cf67dSBram Moolenaar  call assert_equal('n', mode(1))
949957cf67dSBram Moolenaar
950957cf67dSBram Moolenaar  " insert mode
951957cf67dSBram Moolenaar  call feedkeys("i\<F3>abc", 'xt')
952957cf67dSBram Moolenaar  call assert_equal('i', m)
953957cf67dSBram Moolenaar  call assert_equal('abc', getline('.'))
954957cf67dSBram Moolenaar
955957cf67dSBram Moolenaar  " replace mode
956957cf67dSBram Moolenaar  call feedkeys("0R\<F3>two", 'xt')
957957cf67dSBram Moolenaar  call assert_equal('R', m)
958957cf67dSBram Moolenaar  call assert_equal('two', getline('.'))
959957cf67dSBram Moolenaar
960957cf67dSBram Moolenaar  " virtual replace mode
961957cf67dSBram Moolenaar  call setline('.', "one\ttwo")
962957cf67dSBram Moolenaar  call feedkeys("4|gR\<F3>xxx", 'xt')
963957cf67dSBram Moolenaar  call assert_equal('Rv', m)
964957cf67dSBram Moolenaar  call assert_equal("onexxx\ttwo", getline('.'))
965957cf67dSBram Moolenaar
966957cf67dSBram Moolenaar  " cmdline mode
967957cf67dSBram Moolenaar  call feedkeys(":\<F3>\"xxx\<CR>", 'xt!')
968957cf67dSBram Moolenaar  call assert_equal('c', m)
969957cf67dSBram Moolenaar  call assert_equal('"xxx', @:)
970957cf67dSBram Moolenaar
971957cf67dSBram Moolenaar  " terminal mode
972957cf67dSBram Moolenaar  if CanRunVimInTerminal()
973957cf67dSBram Moolenaar    tnoremap <F3> <Cmd>let m = mode(1)<CR>
974957cf67dSBram Moolenaar    let buf = Run_shell_in_terminal({})
975957cf67dSBram Moolenaar    call feedkeys("\<F3>", 'xt')
976957cf67dSBram Moolenaar    call assert_equal('t', m)
977957cf67dSBram Moolenaar    call assert_equal('t', mode(1))
978957cf67dSBram Moolenaar    call StopShellInTerminal(buf)
979957cf67dSBram Moolenaar    call TermWait(buf)
980957cf67dSBram Moolenaar    close!
981957cf67dSBram Moolenaar    tunmap <F3>
982957cf67dSBram Moolenaar  endif
983957cf67dSBram Moolenaar
984957cf67dSBram Moolenaar  " invoke cmdline mode recursively
985957cf67dSBram Moolenaar  noremap! <F2> <Cmd>norm! :foo<CR>
986957cf67dSBram Moolenaar  %d
987957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
988957cf67dSBram Moolenaar  call feedkeys(":bar\<F2>x\<C-B>\"\r", 'xt')
989957cf67dSBram Moolenaar  call assert_equal('"barx', @:)
990957cf67dSBram Moolenaar  unmap! <F2>
991957cf67dSBram Moolenaar
992957cf67dSBram Moolenaar  " test for calling a <SID> function
993957cf67dSBram Moolenaar  let lines =<< trim END
994957cf67dSBram Moolenaar    map <F2> <Cmd>call <SID>do_it()<CR>
995957cf67dSBram Moolenaar    func s:do_it()
996957cf67dSBram Moolenaar      let g:x = 32
997957cf67dSBram Moolenaar    endfunc
998957cf67dSBram Moolenaar  END
999957cf67dSBram Moolenaar  call writefile(lines, 'Xscript')
1000957cf67dSBram Moolenaar  source Xscript
1001957cf67dSBram Moolenaar  call feedkeys("\<F2>", 'xt')
1002957cf67dSBram Moolenaar  call assert_equal(32, g:x)
1003957cf67dSBram Moolenaar  call delete('Xscript')
1004957cf67dSBram Moolenaar
1005957cf67dSBram Moolenaar  unmap <F3>
1006957cf67dSBram Moolenaar  unmap! <F3>
1007957cf67dSBram Moolenaar  %bw!
10084a44120eSBram Moolenaar
10094a44120eSBram Moolenaar  " command line ending in "0" is handled without errors
10104a44120eSBram Moolenaar  onoremap ix <cmd>eval 0<cr>
10114a44120eSBram Moolenaar  call feedkeys('dix.', 'xt')
10124a44120eSBram Moolenaar  ounmap ix
1013957cf67dSBram Moolenaarendfunc
1014957cf67dSBram Moolenaar
1015957cf67dSBram Moolenaar" text object enters visual mode
1016957cf67dSBram Moolenaarfunc TextObj()
1017957cf67dSBram Moolenaar  if mode() !=# "v"
1018957cf67dSBram Moolenaar    normal! v
1019957cf67dSBram Moolenaar  end
1020957cf67dSBram Moolenaar  call cursor(1, 3)
1021957cf67dSBram Moolenaar  normal! o
1022957cf67dSBram Moolenaar  call cursor(2, 4)
1023957cf67dSBram Moolenaarendfunc
1024957cf67dSBram Moolenaar
1025957cf67dSBram Moolenaarfunc s:cmdmap(lhs, rhs)
1026957cf67dSBram Moolenaar  exe 'noremap ' .. a:lhs .. ' <Cmd>' .. a:rhs .. '<CR>'
1027957cf67dSBram Moolenaar  exe 'noremap! ' .. a:lhs .. ' <Cmd>' .. a:rhs .. '<CR>'
1028957cf67dSBram Moolenaarendfunc
1029957cf67dSBram Moolenaar
1030957cf67dSBram Moolenaarfunc s:cmdunmap(lhs)
1031957cf67dSBram Moolenaar  exe 'unmap ' .. a:lhs
1032957cf67dSBram Moolenaar  exe 'unmap! ' .. a:lhs
1033957cf67dSBram Moolenaarendfunc
1034957cf67dSBram Moolenaar
1035957cf67dSBram Moolenaar" Map various <Fx> keys used by the <Cmd> key tests
1036957cf67dSBram Moolenaarfunc s:setupMaps()
1037957cf67dSBram Moolenaar  call s:cmdmap('<F3>', 'let m = mode(1)')
1038957cf67dSBram Moolenaar  call s:cmdmap('<F4>', 'normal! ww')
1039957cf67dSBram Moolenaar  call s:cmdmap('<F5>', 'normal! "ay')
1040957cf67dSBram Moolenaar  call s:cmdmap('<F6>', 'throw "very error"')
1041957cf67dSBram Moolenaar  call s:cmdmap('<F7>', 'call TextObj()')
1042957cf67dSBram Moolenaar  call s:cmdmap('<F8>', 'startinsert')
1043957cf67dSBram Moolenaar  call s:cmdmap('<F9>', 'stopinsert')
1044957cf67dSBram Moolenaarendfunc
1045957cf67dSBram Moolenaar
1046957cf67dSBram Moolenaar" Remove the mappings setup by setupMaps()
1047957cf67dSBram Moolenaarfunc s:cleanupMaps()
1048957cf67dSBram Moolenaar  call s:cmdunmap('<F3>')
1049957cf67dSBram Moolenaar  call s:cmdunmap('<F4>')
1050957cf67dSBram Moolenaar  call s:cmdunmap('<F5>')
1051957cf67dSBram Moolenaar  call s:cmdunmap('<F6>')
1052957cf67dSBram Moolenaar  call s:cmdunmap('<F7>')
1053957cf67dSBram Moolenaar  call s:cmdunmap('<F8>')
1054957cf67dSBram Moolenaar  call s:cmdunmap('<F9>')
1055957cf67dSBram Moolenaarendfunc
1056957cf67dSBram Moolenaar
1057957cf67dSBram Moolenaar" Test for <Cmd> mapping in normal mode
1058957cf67dSBram Moolenaarfunc Test_map_cmdkey_normal_mode()
1059957cf67dSBram Moolenaar  new
1060957cf67dSBram Moolenaar  call s:setupMaps()
1061957cf67dSBram Moolenaar
1062957cf67dSBram Moolenaar  " check v:count and v:register works
1063957cf67dSBram Moolenaar  call s:cmdmap('<F2>', 'let s = [mode(1), v:count, v:register]')
1064957cf67dSBram Moolenaar  call feedkeys("\<F2>", 'xt')
1065957cf67dSBram Moolenaar  call assert_equal(['n', 0, '"'], s)
1066957cf67dSBram Moolenaar  call feedkeys("7\<F2>", 'xt')
1067957cf67dSBram Moolenaar  call assert_equal(['n', 7, '"'], s)
1068957cf67dSBram Moolenaar  call feedkeys("\"e\<F2>", 'xt')
1069957cf67dSBram Moolenaar  call assert_equal(['n', 0, 'e'], s)
1070957cf67dSBram Moolenaar  call feedkeys("5\"k\<F2>", 'xt')
1071957cf67dSBram Moolenaar  call assert_equal(['n', 5, 'k'], s)
1072957cf67dSBram Moolenaar  call s:cmdunmap('<F2>')
1073957cf67dSBram Moolenaar
1074957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1075957cf67dSBram Moolenaar  call feedkeys("\<F7>y", 'xt')
1076957cf67dSBram Moolenaar  call assert_equal("me short lines\nof t", @")
1077957cf67dSBram Moolenaar  call assert_equal('v', getregtype('"'))
1078957cf67dSBram Moolenaar  call assert_equal([0, 1, 3, 0], getpos("'<"))
1079957cf67dSBram Moolenaar  call assert_equal([0, 2, 4, 0], getpos("'>"))
1080957cf67dSBram Moolenaar
1081957cf67dSBram Moolenaar  " startinsert
1082957cf67dSBram Moolenaar  %d
1083957cf67dSBram Moolenaar  call feedkeys("\<F8>abc", 'xt')
1084957cf67dSBram Moolenaar  call assert_equal('abc', getline(1))
1085957cf67dSBram Moolenaar
1086957cf67dSBram Moolenaar  " feedkeys are not executed immediately
1087957cf67dSBram Moolenaar  noremap ,a <Cmd>call feedkeys("aalpha") \| let g:a = getline(2)<CR>
1088957cf67dSBram Moolenaar  %d
1089957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1090957cf67dSBram Moolenaar  call cursor(2, 3)
1091957cf67dSBram Moolenaar  call feedkeys(",a\<F3>", 'xt')
1092957cf67dSBram Moolenaar  call assert_equal('of test text', g:a)
1093957cf67dSBram Moolenaar  call assert_equal('n', m)
1094957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'of alphatest text'], getline(1, '$'))
1095957cf67dSBram Moolenaar  nunmap ,a
1096957cf67dSBram Moolenaar
1097957cf67dSBram Moolenaar  " feedkeys(..., 'x') is executed immediately, but insert mode is aborted
1098957cf67dSBram Moolenaar  noremap ,b <Cmd>call feedkeys("abeta", 'x') \| let g:b = getline(2)<CR>
1099957cf67dSBram Moolenaar  call feedkeys(",b\<F3>", 'xt')
1100957cf67dSBram Moolenaar  call assert_equal('n', m)
1101957cf67dSBram Moolenaar  call assert_equal('of alphabetatest text', g:b)
1102957cf67dSBram Moolenaar  nunmap ,b
1103957cf67dSBram Moolenaar
1104957cf67dSBram Moolenaar  call s:cleanupMaps()
1105957cf67dSBram Moolenaar  %bw!
1106957cf67dSBram Moolenaarendfunc
1107957cf67dSBram Moolenaar
1108957cf67dSBram Moolenaar" Test for <Cmd> mapping with the :normal command
1109957cf67dSBram Moolenaarfunc Test_map_cmdkey_normal_cmd()
1110957cf67dSBram Moolenaar  new
1111957cf67dSBram Moolenaar  noremap ,x <Cmd>call append(1, "xx") \| call append(1, "aa")<CR>
1112957cf67dSBram Moolenaar  noremap ,f <Cmd>nosuchcommand<CR>
1113957cf67dSBram Moolenaar  noremap ,e <Cmd>throw "very error" \| call append(1, "yy")<CR>
1114957cf67dSBram Moolenaar  noremap ,m <Cmd>echoerr "The message." \| call append(1, "zz")<CR>
1115957cf67dSBram Moolenaar  noremap ,w <Cmd>for i in range(5) \| if i==1 \| echoerr "Err" \| endif \| call append(1, i) \| endfor<CR>
1116957cf67dSBram Moolenaar
1117957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1118957cf67dSBram Moolenaar  exe "norm ,x\r"
1119957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'aa', 'xx', 'of test text'], getline(1, '$'))
1120957cf67dSBram Moolenaar
1121957cf67dSBram Moolenaar  call assert_fails('norm ,f', 'E492:')
1122957cf67dSBram Moolenaar  call assert_fails('norm ,e', 'very error')
1123957cf67dSBram Moolenaar  call assert_fails('norm ,m', 'The message.')
1124957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'aa', 'xx', 'of test text'], getline(1, '$'))
1125957cf67dSBram Moolenaar
1126957cf67dSBram Moolenaar  %d
1127957cf67dSBram Moolenaar  let caught_err = 0
1128957cf67dSBram Moolenaar  try
1129957cf67dSBram Moolenaar    exe "normal ,w"
1130957cf67dSBram Moolenaar  catch /Vim(echoerr):Err/
1131957cf67dSBram Moolenaar    let caught_err = 1
1132957cf67dSBram Moolenaar  endtry
1133957cf67dSBram Moolenaar  call assert_equal(1, caught_err)
1134957cf67dSBram Moolenaar  call assert_equal(['', '0'], getline(1, '$'))
1135957cf67dSBram Moolenaar
1136957cf67dSBram Moolenaar  %d
1137957cf67dSBram Moolenaar  call assert_fails('normal ,w', 'Err')
1138957cf67dSBram Moolenaar  call assert_equal(['', '4', '3', '2' ,'1', '0'], getline(1, '$'))
1139957cf67dSBram Moolenaar  call assert_equal(1, line('.'))
1140957cf67dSBram Moolenaar
1141957cf67dSBram Moolenaar  nunmap ,x
1142957cf67dSBram Moolenaar  nunmap ,f
1143957cf67dSBram Moolenaar  nunmap ,e
1144957cf67dSBram Moolenaar  nunmap ,m
1145957cf67dSBram Moolenaar  nunmap ,w
1146957cf67dSBram Moolenaar  %bw!
1147957cf67dSBram Moolenaarendfunc
1148957cf67dSBram Moolenaar
1149957cf67dSBram Moolenaar" Test for <Cmd> mapping in visual mode
1150957cf67dSBram Moolenaarfunc Test_map_cmdkey_visual_mode()
1151957cf67dSBram Moolenaar  new
1152957cf67dSBram Moolenaar  set showmode
1153957cf67dSBram Moolenaar  call s:setupMaps()
1154957cf67dSBram Moolenaar
1155957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1156957cf67dSBram Moolenaar  call feedkeys("v\<F4>", 'xt!')
1157957cf67dSBram Moolenaar  call assert_equal(['v', 1, 12], [mode(1), col('v'), col('.')])
1158957cf67dSBram Moolenaar
1159*f08b0eb8SBram Moolenaar  " can invoke an operator, ending the visual mode
1160957cf67dSBram Moolenaar  let @a = ''
1161957cf67dSBram Moolenaar  call feedkeys("\<F5>", 'xt!')
1162957cf67dSBram Moolenaar  call assert_equal('n', mode(1))
1163957cf67dSBram Moolenaar  call assert_equal('some short l', @a)
1164957cf67dSBram Moolenaar
1165957cf67dSBram Moolenaar  " error doesn't interrupt visual mode
1166957cf67dSBram Moolenaar  call assert_fails('call feedkeys("ggvw\<F6>", "xt!")', 'E605:')
1167957cf67dSBram Moolenaar  call assert_equal(['v', 1, 6], [mode(1), col('v'), col('.')])
1168957cf67dSBram Moolenaar  call feedkeys("\<F7>", 'xt!')
1169957cf67dSBram Moolenaar  call assert_equal(['v', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')])
1170957cf67dSBram Moolenaar
1171957cf67dSBram Moolenaar  " startinsert gives "-- (insert) VISUAL --" mode
1172957cf67dSBram Moolenaar  call feedkeys("\<F8>", 'xt!')
1173957cf67dSBram Moolenaar  call assert_equal(['v', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')])
1174957cf67dSBram Moolenaar  redraw!
1175957cf67dSBram Moolenaar  call assert_match('^-- (insert) VISUAL --', Screenline(&lines))
1176957cf67dSBram Moolenaar  call feedkeys("\<Esc>new ", 'x')
1177957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'of new test text'], getline(1, '$'))
1178957cf67dSBram Moolenaar
1179957cf67dSBram Moolenaar  call s:cleanupMaps()
1180957cf67dSBram Moolenaar  set showmode&
1181957cf67dSBram Moolenaar  %bw!
1182957cf67dSBram Moolenaarendfunc
1183957cf67dSBram Moolenaar
1184957cf67dSBram Moolenaar" Test for <Cmd> mapping in select mode
1185957cf67dSBram Moolenaarfunc Test_map_cmdkey_select_mode()
1186957cf67dSBram Moolenaar  new
1187957cf67dSBram Moolenaar  set showmode
1188957cf67dSBram Moolenaar  call s:setupMaps()
1189957cf67dSBram Moolenaar
1190957cf67dSBram Moolenaar  snoremap <F1> <cmd>throw "very error"<CR>
1191957cf67dSBram Moolenaar  snoremap <F2> <cmd>normal! <c-g>"by<CR>
1192957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1193957cf67dSBram Moolenaar
1194957cf67dSBram Moolenaar  call feedkeys("gh\<F4>", "xt!")
1195957cf67dSBram Moolenaar  call assert_equal(['s', 1, 12], [mode(1), col('v'), col('.')])
1196957cf67dSBram Moolenaar  redraw!
1197957cf67dSBram Moolenaar  call assert_match('^-- SELECT --', Screenline(&lines))
1198957cf67dSBram Moolenaar
1199957cf67dSBram Moolenaar  " visual mapping in select mode restarts select mode after operator
1200957cf67dSBram Moolenaar  let @a = ''
1201957cf67dSBram Moolenaar  call feedkeys("\<F5>", 'xt!')
1202957cf67dSBram Moolenaar  call assert_equal('s', mode(1))
1203957cf67dSBram Moolenaar  call assert_equal('some short l', @a)
1204957cf67dSBram Moolenaar
1205957cf67dSBram Moolenaar  " select mode mapping works, and does not restart select mode
1206957cf67dSBram Moolenaar  let @b = ''
1207957cf67dSBram Moolenaar  call feedkeys("\<F2>", 'xt!')
1208957cf67dSBram Moolenaar  call assert_equal('n', mode(1))
1209957cf67dSBram Moolenaar  call assert_equal('some short l', @b)
1210957cf67dSBram Moolenaar
1211957cf67dSBram Moolenaar  " error doesn't interrupt temporary visual mode
1212957cf67dSBram Moolenaar  call assert_fails('call feedkeys("\<Esc>ggvw\<C-G>\<F6>", "xt!")', 'E605:')
1213957cf67dSBram Moolenaar  redraw!
1214957cf67dSBram Moolenaar  call assert_match('^-- VISUAL --', Screenline(&lines))
1215957cf67dSBram Moolenaar  " quirk: restoration of select mode is not performed
1216957cf67dSBram Moolenaar  call assert_equal(['v', 1, 6], [mode(1), col('v'), col('.')])
1217957cf67dSBram Moolenaar
1218957cf67dSBram Moolenaar  " error doesn't interrupt select mode
1219957cf67dSBram Moolenaar  call assert_fails('call feedkeys("\<Esc>ggvw\<C-G>\<F1>", "xt!")', 'E605:')
1220957cf67dSBram Moolenaar  redraw!
1221957cf67dSBram Moolenaar  call assert_match('^-- SELECT --', Screenline(&lines))
1222957cf67dSBram Moolenaar  call assert_equal(['s', 1, 6], [mode(1), col('v'), col('.')])
1223957cf67dSBram Moolenaar
1224957cf67dSBram Moolenaar  call feedkeys("\<F7>", 'xt!')
1225957cf67dSBram Moolenaar  redraw!
1226957cf67dSBram Moolenaar  call assert_match('^-- SELECT --', Screenline(&lines))
1227957cf67dSBram Moolenaar  call assert_equal(['s', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')])
1228957cf67dSBram Moolenaar
1229957cf67dSBram Moolenaar  " startinsert gives "-- SELECT (insert) --" mode
1230957cf67dSBram Moolenaar  call feedkeys("\<F8>", 'xt!')
1231957cf67dSBram Moolenaar  redraw!
1232957cf67dSBram Moolenaar  call assert_match('^-- (insert) SELECT --', Screenline(&lines))
1233957cf67dSBram Moolenaar  call assert_equal(['s', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')])
1234957cf67dSBram Moolenaar  call feedkeys("\<Esc>new ", 'x')
1235957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'of new test text'], getline(1, '$'))
1236957cf67dSBram Moolenaar
1237957cf67dSBram Moolenaar  sunmap <F1>
1238957cf67dSBram Moolenaar  sunmap <F2>
1239957cf67dSBram Moolenaar  call s:cleanupMaps()
1240957cf67dSBram Moolenaar  set showmode&
1241957cf67dSBram Moolenaar  %bw!
1242957cf67dSBram Moolenaarendfunc
1243957cf67dSBram Moolenaar
1244957cf67dSBram Moolenaar" Test for <Cmd> mapping in operator-pending mode
1245957cf67dSBram Moolenaarfunc Test_map_cmdkey_op_pending_mode()
1246957cf67dSBram Moolenaar  new
1247957cf67dSBram Moolenaar  call s:setupMaps()
1248957cf67dSBram Moolenaar
1249957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1250957cf67dSBram Moolenaar  call feedkeys("d\<F4>", 'xt')
1251957cf67dSBram Moolenaar  call assert_equal(['lines', 'of test text'], getline(1, '$'))
1252957cf67dSBram Moolenaar  call assert_equal(['some short '], getreg('"', 1, 1))
1253957cf67dSBram Moolenaar  " create a new undo point
1254957cf67dSBram Moolenaar  let &undolevels = &undolevels
1255957cf67dSBram Moolenaar
1256957cf67dSBram Moolenaar  call feedkeys(".", 'xt')
1257957cf67dSBram Moolenaar  call assert_equal(['test text'], getline(1, '$'))
1258957cf67dSBram Moolenaar  call assert_equal(['lines', 'of '], getreg('"', 1, 1))
1259957cf67dSBram Moolenaar  " create a new undo point
1260957cf67dSBram Moolenaar  let &undolevels = &undolevels
1261957cf67dSBram Moolenaar
1262957cf67dSBram Moolenaar  call feedkeys("uu", 'xt')
1263957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'of test text'], getline(1, '$'))
1264957cf67dSBram Moolenaar
1265957cf67dSBram Moolenaar  " error aborts operator-pending, operator not performed
1266957cf67dSBram Moolenaar  call assert_fails('call feedkeys("d\<F6>", "xt")', 'E605:')
1267957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'of test text'], getline(1, '$'))
1268957cf67dSBram Moolenaar
1269957cf67dSBram Moolenaar  call feedkeys("\"bd\<F7>", 'xt')
1270957cf67dSBram Moolenaar  call assert_equal(['soest text'], getline(1, '$'))
1271957cf67dSBram Moolenaar  call assert_equal(['me short lines', 'of t'], getreg('b', 1, 1))
1272957cf67dSBram Moolenaar
1273957cf67dSBram Moolenaar  " startinsert aborts operator
1274957cf67dSBram Moolenaar  call feedkeys("d\<F8>cc", 'xt')
1275957cf67dSBram Moolenaar  call assert_equal(['soccest text'], getline(1, '$'))
1276957cf67dSBram Moolenaar
1277957cf67dSBram Moolenaar  call s:cleanupMaps()
1278957cf67dSBram Moolenaar  %bw!
1279957cf67dSBram Moolenaarendfunc
1280957cf67dSBram Moolenaar
1281957cf67dSBram Moolenaar" Test for <Cmd> mapping in insert mode
1282957cf67dSBram Moolenaarfunc Test_map_cmdkey_insert_mode()
1283957cf67dSBram Moolenaar  new
1284957cf67dSBram Moolenaar  call s:setupMaps()
1285957cf67dSBram Moolenaar
1286957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1287957cf67dSBram Moolenaar  " works the same as <C-O>w<C-O>w
1288957cf67dSBram Moolenaar  call feedkeys("iindeed \<F4>little ", 'xt')
1289957cf67dSBram Moolenaar  call assert_equal(['indeed some short little lines', 'of test text'], getline(1, '$'))
1290957cf67dSBram Moolenaar  call assert_fails('call feedkeys("i\<F6> 2", "xt")', 'E605:')
1291957cf67dSBram Moolenaar  call assert_equal(['indeed some short little 2 lines', 'of test text'], getline(1, '$'))
1292957cf67dSBram Moolenaar
1293957cf67dSBram Moolenaar  " Note when entering visual mode from InsertEnter autocmd, an async event,
1294957cf67dSBram Moolenaar  " or a <Cmd> mapping, vim ends up in undocumented "INSERT VISUAL" mode.
1295957cf67dSBram Moolenaar  call feedkeys("i\<F7>stuff ", 'xt')
1296957cf67dSBram Moolenaar  call assert_equal(['indeed some short little 2 lines', 'of stuff test text'], getline(1, '$'))
1297957cf67dSBram Moolenaar  call assert_equal(['v', 1, 3, 2, 9], [mode(1), line('v'), col('v'), line('.'), col('.')])
1298957cf67dSBram Moolenaar
1299957cf67dSBram Moolenaar  call feedkeys("\<F5>", 'xt')
1300957cf67dSBram Moolenaar  call assert_equal(['deed some short little 2 lines', 'of stuff '], getreg('a', 1, 1))
1301957cf67dSBram Moolenaar
1302957cf67dSBram Moolenaar  " also works as part of abbreviation
1303957cf67dSBram Moolenaar  abbr foo <Cmd>let g:y = 17<CR>bar
1304957cf67dSBram Moolenaar  exe "normal i\<space>foo "
1305957cf67dSBram Moolenaar  call assert_equal(17, g:y)
1306957cf67dSBram Moolenaar  call assert_equal('in bar deed some short little 2 lines', getline(1))
1307957cf67dSBram Moolenaar  unabbr foo
1308957cf67dSBram Moolenaar
1309957cf67dSBram Moolenaar  " :startinsert does nothing
1310957cf67dSBram Moolenaar  call setline(1, 'foo bar')
1311957cf67dSBram Moolenaar  call feedkeys("ggi\<F8>vim", 'xt')
1312957cf67dSBram Moolenaar  call assert_equal('vimfoo bar', getline(1))
1313957cf67dSBram Moolenaar
1314957cf67dSBram Moolenaar  " :stopinsert works
1315957cf67dSBram Moolenaar  call feedkeys("ggi\<F9>Abc", 'xt')
1316957cf67dSBram Moolenaar  call assert_equal('vimfoo barbc', getline(1))
1317957cf67dSBram Moolenaar
1318957cf67dSBram Moolenaar  call s:cleanupMaps()
1319957cf67dSBram Moolenaar  %bw!
1320957cf67dSBram Moolenaarendfunc
1321957cf67dSBram Moolenaar
1322957cf67dSBram Moolenaar" Test for <Cmd> mapping in insert-completion mode
1323957cf67dSBram Moolenaarfunc Test_map_cmdkey_insert_complete_mode()
1324957cf67dSBram Moolenaar  new
1325957cf67dSBram Moolenaar  call s:setupMaps()
1326957cf67dSBram Moolenaar
1327957cf67dSBram Moolenaar  call setline(1, 'some short lines')
1328957cf67dSBram Moolenaar  call feedkeys("os\<C-X>\<C-N>\<F3>\<C-N> ", 'xt')
1329957cf67dSBram Moolenaar  call assert_equal('ic', m)
1330957cf67dSBram Moolenaar  call assert_equal(['some short lines', 'short '], getline(1, '$'))
1331957cf67dSBram Moolenaar
1332957cf67dSBram Moolenaar  call s:cleanupMaps()
1333957cf67dSBram Moolenaar  %bw!
1334957cf67dSBram Moolenaarendfunc
1335957cf67dSBram Moolenaar
1336957cf67dSBram Moolenaar" Test for <Cmd> mapping in cmdline mode
1337957cf67dSBram Moolenaarfunc Test_map_cmdkey_cmdline_mode()
1338957cf67dSBram Moolenaar  new
1339957cf67dSBram Moolenaar  call s:setupMaps()
1340957cf67dSBram Moolenaar
1341957cf67dSBram Moolenaar  call setline(1, ['some short lines', 'of test text'])
1342957cf67dSBram Moolenaar  let x = 0
1343957cf67dSBram Moolenaar  call feedkeys(":let x\<F3>= 10\r", 'xt')
1344957cf67dSBram Moolenaar  call assert_equal('c', m)
1345957cf67dSBram Moolenaar  call assert_equal(10, x)
1346957cf67dSBram Moolenaar
1347957cf67dSBram Moolenaar  " exception doesn't leave cmdline mode
1348957cf67dSBram Moolenaar  call assert_fails('call feedkeys(":let x\<F6>= 20\r", "xt")', 'E605:')
1349957cf67dSBram Moolenaar  call assert_equal(20, x)
1350957cf67dSBram Moolenaar
1351957cf67dSBram Moolenaar  " move cursor in the buffer from cmdline mode
1352957cf67dSBram Moolenaar  call feedkeys(":let x\<F4>= 30\r", 'xt')
1353957cf67dSBram Moolenaar  call assert_equal(30, x)
1354957cf67dSBram Moolenaar  call assert_equal(12, col('.'))
1355957cf67dSBram Moolenaar
1356957cf67dSBram Moolenaar  " :startinsert takes effect after leaving cmdline mode
1357957cf67dSBram Moolenaar  call feedkeys(":let x\<F8>= 40\rnew ", 'xt')
1358957cf67dSBram Moolenaar  call assert_equal(40, x)
1359957cf67dSBram Moolenaar  call assert_equal('some short new lines', getline(1))
1360957cf67dSBram Moolenaar
1361957cf67dSBram Moolenaar  call s:cleanupMaps()
1362957cf67dSBram Moolenaar  %bw!
1363957cf67dSBram Moolenaarendfunc
1364957cf67dSBram Moolenaar
1365c77534c3SBram Moolenaarfunc Test_map_cmdkey_redo()
1366c77534c3SBram Moolenaar  func SelectDash()
1367c77534c3SBram Moolenaar    call search('^---\n\zs', 'bcW')
1368c77534c3SBram Moolenaar    norm! V
1369c77534c3SBram Moolenaar    call search('\n\ze---$', 'W')
1370c77534c3SBram Moolenaar  endfunc
1371c77534c3SBram Moolenaar
1372c77534c3SBram Moolenaar  let text =<< trim END
1373c77534c3SBram Moolenaar      ---
1374c77534c3SBram Moolenaar      aaa
1375c77534c3SBram Moolenaar      ---
1376c77534c3SBram Moolenaar      bbb
1377c77534c3SBram Moolenaar      bbb
1378c77534c3SBram Moolenaar      ---
1379c77534c3SBram Moolenaar      ccc
1380c77534c3SBram Moolenaar      ccc
1381c77534c3SBram Moolenaar      ccc
1382c77534c3SBram Moolenaar      ---
1383c77534c3SBram Moolenaar  END
1384c77534c3SBram Moolenaar  new Xcmdtext
1385c77534c3SBram Moolenaar  call setline(1, text)
1386c77534c3SBram Moolenaar
1387c77534c3SBram Moolenaar  onoremap <silent> i- <Cmd>call SelectDash()<CR>
1388c77534c3SBram Moolenaar  call feedkeys('2Gdi-', 'xt')
1389c77534c3SBram Moolenaar  call assert_equal(['---', '---'], getline(1, 2))
1390c77534c3SBram Moolenaar  call feedkeys('j.', 'xt')
1391c77534c3SBram Moolenaar  call assert_equal(['---', '---', '---'], getline(1, 3))
1392c77534c3SBram Moolenaar  call feedkeys('j.', 'xt')
1393c77534c3SBram Moolenaar  call assert_equal(['---', '---', '---', '---'], getline(1, 4))
1394c77534c3SBram Moolenaar
1395c77534c3SBram Moolenaar  bwipe!
1396c77534c3SBram Moolenaar  call delete('Xcmdtext')
1397c77534c3SBram Moolenaar  delfunc SelectDash
1398c77534c3SBram Moolenaar  ounmap i-
1399c77534c3SBram Moolenaarendfunc
1400c77534c3SBram Moolenaar
14011f448d90SBram Moolenaar" Test for using <script> with a map to remap characters in rhs
14021f448d90SBram Moolenaarfunc Test_script_local_remap()
14031f448d90SBram Moolenaar  new
14041f448d90SBram Moolenaar  inoremap <buffer> <SID>xyz mno
14051f448d90SBram Moolenaar  inoremap <buffer> <script> abc st<SID>xyzre
14061f448d90SBram Moolenaar  normal iabc
14071f448d90SBram Moolenaar  call assert_equal('stmnore', getline(1))
14081f448d90SBram Moolenaar  bwipe!
14091f448d90SBram Moolenaarendfunc
14101f448d90SBram Moolenaar
14114934ed34SBram Moolenaarfunc Test_abbreviate_multi_byte()
14124934ed34SBram Moolenaar  new
14134934ed34SBram Moolenaar  iabbrev foo bar
14144934ed34SBram Moolenaar  call feedkeys("ifoo…\<Esc>", 'xt')
14154934ed34SBram Moolenaar  call assert_equal("bar…", getline(1))
14164934ed34SBram Moolenaar  iunabbrev foo
14174934ed34SBram Moolenaar  bwipe!
14184934ed34SBram Moolenaarendfunc
14194934ed34SBram Moolenaar
14202d6d718dSYegappan Lakshmanan" Test for abbreviations with 'latin1' encoding
14212d6d718dSYegappan Lakshmananfunc Test_abbreviate_latin1_encoding()
14222d6d718dSYegappan Lakshmanan  set encoding=latin1
14232d6d718dSYegappan Lakshmanan  call assert_fails('abbr ab#$c ABC', 'E474:')
14242d6d718dSYegappan Lakshmanan  new
14252d6d718dSYegappan Lakshmanan  iabbr <buffer> #i #include
14262d6d718dSYegappan Lakshmanan  iabbr <buffer> ## #enddef
14272d6d718dSYegappan Lakshmanan  exe "normal i#i\<C-]>"
14282d6d718dSYegappan Lakshmanan  call assert_equal('#include', getline(1))
14292d6d718dSYegappan Lakshmanan  exe "normal 0Di##\<C-]>"
14302d6d718dSYegappan Lakshmanan  call assert_equal('#enddef', getline(1))
14312d6d718dSYegappan Lakshmanan  %bw!
14322d6d718dSYegappan Lakshmanan  set encoding=utf-8
14332d6d718dSYegappan Lakshmananendfunc
14342d6d718dSYegappan Lakshmanan
14358ba6bb7cSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1436