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 ') 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') expect('alllaaa') end) it('Ignores :lmap in insert mode when OFF', function() command('set iminsert=0') feed('il') expect('llllaaa') end) it('Can be toggled with in insert mode', function() feed('ill') expect('lalllaaa') eq(1, eval('&iminsert')) feed('i') eq(0, eval('&iminsert')) end) end) describe("'imsearch' option", function() it('Uses :lmap at search prompt when ON', function() feed('/lll3x') expect('lll') end) it('Ignores :lmap at search prompt when OFF', function() command('set imsearch=0') feed('gg/lll3x') expect('aaa') end) it('Can be toggled with C-^', function() eq(1, eval('&imsearch')) feed('/lll3x') expect('aaa') eq(0, eval('&imsearch')) feed('u0/lll3x') expect('lll') eq(1, eval('&imsearch')) end) it("can follow 'iminsert'", function() command('set imsearch=-1') feed('/lll3x') expect('lll') eq(-1, eval('&imsearch')) eq(1, eval('&iminsert')) feed('u/lll3x') 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('qailq@a') expect('aalllaaa') eq('ia', call('getreg', 'a')) end) it(':lmap not applied to mappings', function() command('imap t l') feed('it') expect('llllaaa') end) it('mappings applied to keys created with :lmap', function() command('imap a x') feed('il') 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') 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('qailq') expect('alllaaa') feed('@a') expect('aalllaaa') end) it('is applied when using f/F t/T', function() feed('flx') expect('lllaa') feed('0ia4lFlx') expect('lllaa') feed('tllx') expect('llla') feed('0ia4lTlhx') expect('llla') end) it('takes priority over :imap mappings', function() command('imap l x') feed('il') 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('qailaq') expect('allllaaa') feed('u@a') expect('allllaaa') end) it('can handle multicharacter mappings', function() command("lmap 'a x") command("lmap '' '") feed("qai'a''aq") expect("x'alllaaa") feed('u@a') expect("x'alllaaa") end) end)