From a4f6cec7a31ff8dbfa089b9e22227afbeb951e9b Mon Sep 17 00:00:00 2001 From: Björn Linse Date: Wed, 22 Nov 2017 22:35:20 +0100 Subject: cmdline: CmdlineEnter and CmdlineLeave autocommands (#7422) vim-patch:fafcf0dd59fd patch 8.0.1206: no autocmd for entering or leaving the command line Problem: No autocmd for entering or leaving the command line. Solution: Add CmdlineEnter and CmdlineLeave. https://github.com/vim/vim/commit/fafcf0dd59fd9c4ef743bb333ae40d1d322b6079 --- test/functional/autocmd/cmdline_spec.lua | 117 +++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 test/functional/autocmd/cmdline_spec.lua (limited to 'test/functional') diff --git a/test/functional/autocmd/cmdline_spec.lua b/test/functional/autocmd/cmdline_spec.lua new file mode 100644 index 0000000000..b0ce03b141 --- /dev/null +++ b/test/functional/autocmd/cmdline_spec.lua @@ -0,0 +1,117 @@ +local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') + +local clear = helpers.clear +local command = helpers.command +local eq = helpers.eq +local expect = helpers.expect +local next_msg = helpers.next_message +local feed = helpers.feed +local meths = helpers.meths + +describe('cmdline autocommands', function() + local channel + before_each(function() + clear() + channel = meths.get_api_info()[1] + meths.set_var("channel",channel) + command("autocmd CmdlineEnter * call rpcnotify(g:channel, 'CmdlineEnter', v:event)") + command("autocmd CmdlineLeave * call rpcnotify(g:channel, 'CmdlineLeave', v:event)") + command("autocmd CmdWinEnter * call rpcnotify(g:channel, 'CmdWinEnter', v:event)") + command("autocmd CmdWinLeave * call rpcnotify(g:channel, 'CmdWinLeave', v:event)") + end) + + it('works', function() + feed(':') + eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=1}}}, next_msg()) + feed('redraw') + eq({'notification', 'CmdlineLeave', + {{cmdtype=':', cmdlevel=1, abort=false}}}, next_msg()) + + feed(':') + eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=1}}}, next_msg()) + + -- note: feed('bork') might not consume 'bork' + -- due to out-of-band interupt handling + feed('bork') + eq({'notification', 'CmdlineLeave', + {{cmdtype=':', cmdlevel=1, abort=true}}}, next_msg()) + end) + + it('can abort cmdline', function() + command("autocmd CmdlineLeave * let v:event.abort= len(getcmdline())>15") + feed(":put! ='ok'") + expect([[ + ok + ]]) + + feed(":put! ='blah blah'") + expect([[ + ok + ]]) + end) + + it('handles errors correctly', function() + clear() + local screen = Screen.new(72, 8) + screen:attach() + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue1}, + [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red}, + [3] = {bold = true, foreground = Screen.colors.SeaGreen4}, + }) + command("autocmd CmdlineEnter * echoerr 'FAIL'") + command("autocmd CmdlineLeave * echoerr 'very error'") + feed(':') + screen:expect([[ + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + : | + {2:E920: autocmd has thrown an exception: Vim(echoerr):FAIL} | + :^ | + ]]) + feed("put ='lorem ipsum'") + screen:expect([[ + {1:~ }| + {1:~ }| + : | + {2:E920: autocmd has thrown an exception: Vim(echoerr):FAIL} | + :put ='lorem ipsum' | + {2:E920: autocmd has thrown an exception: Vim(echoerr):very error} | + | + {3:Press ENTER or type command to continue}^ | + ]]) + + feed('') + screen:expect([[ + | + ^lorem ipsum | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]) + end) + + it('works with nested cmdline', function() + feed(':') + eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=1}}}, next_msg()) + feed('=') + eq({'notification', 'CmdlineEnter', {{cmdtype='=', cmdlevel=2}}}, next_msg()) + feed('') + eq({'notification', 'CmdWinEnter', {{}}}, next_msg()) + feed(':') + eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=3}}}, next_msg()) + feed('') + eq({'notification', 'CmdlineLeave', {{cmdtype=':', cmdlevel=3, abort=true}}}, next_msg()) + feed('') + eq({'notification', 'CmdWinLeave', {{}}}, next_msg()) + feed('1+2') + eq({'notification', 'CmdlineLeave', {{cmdtype='=', cmdlevel=2, abort=false}}}, next_msg()) + end) +end) -- cgit