neovim/test/functional/editor/macro_spec.lua
2024-01-12 13:01:06 +00:00

164 lines
4.4 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local helpers = require('test.functional.helpers')(after_each)
local eq = helpers.eq
local eval = helpers.eval
local feed = helpers.feed
local clear = helpers.clear
local expect = helpers.expect
local command = helpers.command
local funcs = helpers.funcs
local meths = helpers.meths
local insert = helpers.insert
local curbufmeths = helpers.curbufmeths
describe('macros', function()
before_each(function()
clear({ args_rm = { '--cmd' } })
end)
it('can be recorded and replayed', function()
feed('qiahello<esc>q')
expect('hello')
eq('ahello', eval('@i'))
feed('@i')
expect('hellohello')
eq('ahello', eval('@i'))
end)
it('applies maps', function()
command('imap x l')
command('nmap l a')
feed('qilxxx<esc>q')
expect('lll')
eq('lxxx', eval('@i'))
feed('@i')
expect('llllll')
eq('lxxx', eval('@i'))
end)
it('can be replayed with Q', function()
insert [[hello
hello
hello]]
feed [[gg]]
feed [[qqAFOO<esc>q]]
eq({ 'helloFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[Q]]
eq({ 'helloFOOFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[G3Q]]
eq({ 'helloFOOFOO', 'hello', 'helloFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
feed [[ggV3jQ]]
eq({ 'helloFOOFOOFOO', 'helloFOO', 'helloFOOFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
end)
it('can be replayed with @', function()
insert [[hello
hello
hello]]
feed [[gg]]
feed [[qqAFOO<esc>q]]
eq({ 'helloFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[Q]]
eq({ 'helloFOOFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[G3@@]]
eq({ 'helloFOOFOO', 'hello', 'helloFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
feed [[ggV2j@@]]
eq({ 'helloFOOFOOFOO', 'helloFOO', 'helloFOOFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
end)
it('can be replayed with @q and @w', function()
insert [[hello
hello
hello]]
feed [[gg]]
feed [[qqAFOO<esc>qu]]
eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[qwA123<esc>qu]]
eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[V3j@q]]
eq({ 'helloFOO', 'helloFOO', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
feed [[gg]]
feed [[Vj@w]]
eq({ 'helloFOO123', 'helloFOO123', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
end)
it('can be replayed with @q and @w visual-block', function()
insert [[hello
hello
hello]]
feed [[gg]]
feed [[qqAFOO<esc>qu]]
eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[qwA123<esc>qu]]
eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
feed [[<C-v>3j@q]]
eq({ 'helloFOO', 'helloFOO', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
feed [[gg]]
feed [[<C-v>j@w]]
eq({ 'helloFOO123', 'helloFOO123', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
end)
end)
describe('immediately after a macro has finished executing,', function()
before_each(function()
clear()
command([[let @a = 'gg0']])
end)
describe('reg_executing() from RPC returns an empty string', function()
it('if the macro does not end with a <Nop> mapping', function()
feed('@a')
eq('', funcs.reg_executing())
end)
it('if the macro ends with a <Nop> mapping', function()
command('nnoremap 0 <Nop>')
feed('@a')
eq('', funcs.reg_executing())
end)
end)
describe('characters from a mapping are not treated as a part of the macro #18015', function()
before_each(function()
command('nnoremap s qa')
end)
it('if the macro does not end with a <Nop> mapping', function()
feed('@asq') -- "q" from "s" mapping should start recording a macro instead of being no-op
eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
expect('')
eq('', eval('@a'))
end)
it('if the macro ends with a <Nop> mapping', function()
command('nnoremap 0 <Nop>')
feed('@asq') -- "q" from "s" mapping should start recording a macro instead of being no-op
eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
expect('')
eq('', eval('@a'))
end)
end)
end)
describe('reg_recorded()', function()
before_each(clear)
it('returns the correct value', function()
feed [[qqyyq]]
eq('q', eval('reg_recorded()'))
end)
end)