2017-04-04 06:07:08 -07:00
|
|
|
|
local helpers = require('test.functional.helpers')(after_each)
|
|
|
|
|
local clear, feed, eq = helpers.clear, helpers.feed, helpers.eq
|
|
|
|
|
local expect, command, eval = helpers.expect, helpers.command, helpers.eval
|
|
|
|
|
local insert, call = helpers.insert, helpers.call
|
|
|
|
|
local funcs, dedent = helpers.funcs, helpers.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 :lnoremap", function()
|
|
|
|
|
-- Shows that 'keymap' sets language mappings without allowing
|
|
|
|
|
-- remapping of those mappings.
|
|
|
|
|
-- 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.
|
|
|
|
|
it("'keymap' mappings are shown with :lmap", function()
|
|
|
|
|
command('lmapclear')
|
|
|
|
|
command('lmapclear <buffer>')
|
|
|
|
|
command('set keymap=dvorak')
|
|
|
|
|
command('set nomore')
|
|
|
|
|
local bindings = funcs.nvim_command_output('lmap')
|
|
|
|
|
eq(bindings, 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 } *@+]]))
|
|
|
|
|
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(eval('&iminsert'), 1)
|
|
|
|
|
feed('i<C-^><esc>')
|
|
|
|
|
eq(eval('&iminsert'), 0)
|
|
|
|
|
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(eval('&imsearch'), 1)
|
|
|
|
|
feed('/<C-^>lll<cr>3x')
|
|
|
|
|
expect('aaa')
|
|
|
|
|
eq(eval('&imsearch'), 0)
|
|
|
|
|
feed('u0/<C-^>lll<cr>3x')
|
|
|
|
|
expect('lll')
|
|
|
|
|
eq(eval('&imsearch'), 1)
|
|
|
|
|
end)
|
|
|
|
|
it("can follow 'iminsert'", function()
|
|
|
|
|
command('set imsearch=-1')
|
|
|
|
|
feed('/lll<cr>3x')
|
|
|
|
|
expect('lll')
|
|
|
|
|
eq(eval('&imsearch'), -1)
|
|
|
|
|
eq(eval('&iminsert'), 1)
|
|
|
|
|
feed('u/<C-^>lll<cr>3x')
|
|
|
|
|
expect('aaa')
|
|
|
|
|
eq(eval('&imsearch'), -1)
|
|
|
|
|
eq(eval('&iminsert'), 0)
|
|
|
|
|
end)
|
|
|
|
|
end)
|
|
|
|
|
it(":lmap not applied to macros", function()
|
|
|
|
|
command("call setreg('a', 'il')")
|
|
|
|
|
feed('@a')
|
|
|
|
|
expect('llllaaa')
|
|
|
|
|
eq(call('getreg', 'a'), 'il')
|
|
|
|
|
end)
|
|
|
|
|
it(":lmap applied to macro recording", function()
|
|
|
|
|
feed('qail<esc>q@a')
|
|
|
|
|
expect('aalllaaa')
|
|
|
|
|
eq(call('getreg', 'a'), 'ia')
|
|
|
|
|
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()
|
2018-01-24 06:09:22 -07:00
|
|
|
|
command('lmapclear')
|
|
|
|
|
command('lnoremap l a')
|
|
|
|
|
command('imap a x')
|
|
|
|
|
feed('il<esc>')
|
|
|
|
|
expect('alllaaa')
|
|
|
|
|
end)
|
|
|
|
|
-- This is a problem introduced when introducting :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()
|
2017-04-04 06:07:08 -07:00
|
|
|
|
command('lmapclear')
|
|
|
|
|
command('lnoremap l a')
|
|
|
|
|
command('imap a x')
|
2017-06-02 07:23:18 -07:00
|
|
|
|
feed('qail<esc>q')
|
2017-04-04 06:07:08 -07:00
|
|
|
|
expect('alllaaa')
|
2017-06-02 07:23:18 -07:00
|
|
|
|
feed('@a')
|
|
|
|
|
expect('aalllaaa')
|
2017-04-04 06:07:08 -07:00
|
|
|
|
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)
|
|
|
|
|
end)
|