aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Malcomson <hardenedapple@gmail.com>2017-04-04 14:07:08 +0100
committerMatthew Malcomson <hardenedapple@gmail.com>2018-03-14 10:39:14 +0000
commit20bfe0f2a34a69f85af262fe350761f85776ad46 (patch)
tree094dbfe457a16811571273109471b51e31ba76ec
parent1aefbff641ec6da77aa1954cbc6d1f10e0f69346 (diff)
downloadrneovim-20bfe0f2a34a69f85af262fe350761f85776ad46.tar.gz
rneovim-20bfe0f2a34a69f85af262fe350761f85776ad46.tar.bz2
rneovim-20bfe0f2a34a69f85af262fe350761f85776ad46.zip
Account for :lmap in macros
close #5652 Start by adding some tests
-rw-r--r--test/functional/options/keymap_spec.lua206
1 files changed, 206 insertions, 0 deletions
diff --git a/test/functional/options/keymap_spec.lua b/test/functional/options/keymap_spec.lua
new file mode 100644
index 0000000000..ffb76a42bd
--- /dev/null
+++ b/test/functional/options/keymap_spec.lua
@@ -0,0 +1,206 @@
+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()
+ command('lmapclear')
+ command('lnoremap l a')
+ command('imap a x')
+ feed('il<esc>')
+ expect('alllaaa')
+ 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)