123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- local t = require('test.testutil')
- local n = require('test.functional.testnvim')()
- local clear, feed, eq = n.clear, n.feed, t.eq
- local expect, command, eval = n.expect, n.command, n.eval
- local insert, call = n.insert, n.call
- local exec_capture, dedent = n.exec_capture, t.dedent
- -- First test it's implemented using the :lmap and :lnoremap commands, then
- -- check those mappings behave as expected.
- describe("'keymap' / :lmap", function()
- clear()
- before_each(function()
- clear()
- insert('lllaaa')
- command('set iminsert=1')
- command('set imsearch=1')
- command('lmap l a')
- feed('gg0')
- end)
- describe("'keymap' as :lmap", function()
- -- Shows that 'keymap' sets language mappings that allows remapping.
- -- This equivalence allows us to only test :lmap commands and assert they
- -- behave the same as 'keymap' settings.
- -- It does rely on the absence of special code that implements 'keymap'
- -- and :lmap differently but shows mappings from the 'keymap' after
- -- typing :lmap.
- -- At the moment this is the case.
- it("'keymap' mappings are shown with :lmap", function()
- command('lmapclear')
- command('lmapclear <buffer>')
- command('set keymap=dvorak')
- command('set nomore')
- local bindings = exec_capture('lmap')
- eq(
- dedent([[
- l " @_
- l ' @-
- l + @}
- l , @w
- l - @[
- l . @v
- l / @z
- l : @S
- l ; @s
- l < @W
- l = @]
- l > @V
- l ? @Z
- l A @A
- l B @X
- l C @J
- l D @E
- l E @>
- l F @U
- l G @I
- l H @D
- l I @C
- l J @H
- l K @T
- l L @N
- l M @M
- l N @B
- l O @R
- l P @L
- l Q @"
- l R @P
- l S @O
- l T @Y
- l U @G
- l V @K
- l W @<
- l X @Q
- l Y @F
- l Z @:
- l [ @/
- l \ @\
- l ] @=
- l _ @{
- l a @a
- l b @x
- l c @j
- l d @e
- l e @.
- l f @u
- l g @i
- l h @d
- l i @c
- l j @h
- l k @t
- l l @n
- l m @m
- l n @b
- l o @r
- l p @l
- l q @'
- l r @p
- l s @o
- l t @y
- l u @g
- l v @k
- l w @,
- l x @q
- l y @f
- l z @;
- l { @?
- l | @|
- l } @+]]),
- bindings
- )
- end)
- end)
- describe("'iminsert' option", function()
- it('Uses :lmap in insert mode when ON', function()
- feed('il<esc>')
- expect('alllaaa')
- end)
- it('Ignores :lmap in insert mode when OFF', function()
- command('set iminsert=0')
- feed('il<esc>')
- expect('llllaaa')
- end)
- it('Can be toggled with <C-^> in insert mode', function()
- feed('i<C-^>l<C-^>l<esc>')
- expect('lalllaaa')
- eq(1, eval('&iminsert'))
- feed('i<C-^><esc>')
- eq(0, eval('&iminsert'))
- end)
- end)
- describe("'imsearch' option", function()
- it('Uses :lmap at search prompt when ON', function()
- feed('/lll<cr>3x')
- expect('lll')
- end)
- it('Ignores :lmap at search prompt when OFF', function()
- command('set imsearch=0')
- feed('gg/lll<cr>3x')
- expect('aaa')
- end)
- it('Can be toggled with C-^', function()
- eq(1, eval('&imsearch'))
- feed('/<C-^>lll<cr>3x')
- expect('aaa')
- eq(0, eval('&imsearch'))
- feed('u0/<C-^>lll<cr>3x')
- expect('lll')
- eq(1, eval('&imsearch'))
- end)
- it("can follow 'iminsert'", function()
- command('set imsearch=-1')
- feed('/lll<cr>3x')
- expect('lll')
- eq(-1, eval('&imsearch'))
- eq(1, eval('&iminsert'))
- feed('u/<C-^>lll<cr>3x')
- expect('aaa')
- eq(-1, eval('&imsearch'))
- eq(0, eval('&iminsert'))
- end)
- end)
- it(':lmap not applied to macros', function()
- command("call setreg('a', 'il')")
- feed('@a')
- expect('llllaaa')
- eq('il', call('getreg', 'a'))
- end)
- it(':lmap applied to macro recording', function()
- feed('qail<esc>q@a')
- expect('aalllaaa')
- eq('ia', call('getreg', 'a'))
- end)
- it(':lmap not applied to mappings', function()
- command('imap t l')
- feed('it<esc>')
- expect('llllaaa')
- end)
- it('mappings applied to keys created with :lmap', function()
- command('imap a x')
- feed('il<esc>')
- expect('xlllaaa')
- end)
- it('mappings not applied to keys gotten with :lnoremap', function()
- command('lmapclear')
- command('lnoremap l a')
- command('imap a x')
- feed('il<esc>')
- expect('alllaaa')
- end)
- -- This is a problem introduced when introducing :lmap and macro
- -- compatibility. There are no plans to fix this as the complexity involved
- -- seems too great.
- pending('mappings not applied to macro replay of :lnoremap', function()
- command('lmapclear')
- command('lnoremap l a')
- command('imap a x')
- feed('qail<esc>q')
- expect('alllaaa')
- feed('@a')
- expect('aalllaaa')
- end)
- it('is applied when using f/F t/T', function()
- feed('flx')
- expect('lllaa')
- feed('0ia<esc>4lFlx')
- expect('lllaa')
- feed('tllx')
- expect('llla')
- feed('0ia<esc>4lTlhx')
- expect('llla')
- end)
- it('takes priority over :imap mappings', function()
- command('imap l x')
- feed('il<esc>')
- expect('alllaaa')
- command('lmapclear')
- command('lmap l a')
- feed('il')
- expect('aalllaaa')
- end)
- it('does not cause recursive mappings', function()
- command('lmap a l')
- feed('qaila<esc>q')
- expect('allllaaa')
- feed('u@a')
- expect('allllaaa')
- end)
- it('can handle multicharacter mappings', function()
- command("lmap 'a x")
- command("lmap '' '")
- feed("qai'a''a<esc>q")
- expect("x'alllaaa")
- feed('u@a')
- expect("x'alllaaa")
- end)
- end)
|