aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-07-18 00:08:57 +0300
committerZyX <kp-pav@yandex.ru>2017-07-18 00:08:57 +0300
commitcfb1d937a64fcec836fdf26d6ea67024aeafabeb (patch)
treefb2959cef61224433c5ad2204f23e818b336ccd4
parent3a923ad2db87b2bece89616b28a14ab9826d569a (diff)
downloadrneovim-cfb1d937a64fcec836fdf26d6ea67024aeafabeb.tar.gz
rneovim-cfb1d937a64fcec836fdf26d6ea67024aeafabeb.tar.bz2
rneovim-cfb1d937a64fcec836fdf26d6ea67024aeafabeb.zip
api helpers: Also save and restore did_emsg
-rw-r--r--src/nvim/api/private/helpers.c19
-rw-r--r--src/nvim/api/private/helpers.h7
-rw-r--r--test/functional/ui/cmdline_highlight_spec.lua38
3 files changed, 54 insertions, 10 deletions
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index 6ff56709cd..b6ecc319c1 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -46,20 +46,22 @@ typedef struct {
void try_enter(TryState *const tstate)
{
*tstate = (TryState) {
+ .current_exception = current_exception,
+ .msg_list = (const struct msglist *const *)msg_list,
+ .private_msg_list = NULL,
.trylevel = trylevel,
.got_int = got_int,
.did_throw = did_throw,
.need_rethrow = need_rethrow,
- .current_exception = current_exception,
- .msg_list = (const struct msglist *const *)msg_list,
- .private_msg_list = NULL,
+ .did_emsg = did_emsg,
};
+ msg_list = &tstate->private_msg_list;
+ current_exception = NULL;
trylevel = 1;
got_int = false;
did_throw = false;
need_rethrow = false;
- msg_list = &tstate->private_msg_list;
- current_exception = NULL;
+ did_emsg = false;
}
/// End try block, set the error message if any and restore previous state
@@ -79,14 +81,17 @@ bool try_leave(const TryState *const tstate, Error *const err)
assert(!need_rethrow);
assert(!got_int);
assert(!did_throw);
+ assert(!did_emsg);
assert(msg_list == &tstate->private_msg_list);
assert(*msg_list == NULL);
assert(current_exception == NULL);
+ msg_list = (struct msglist **)tstate->msg_list;
+ current_exception = tstate->current_exception;
trylevel = tstate->trylevel;
got_int = tstate->got_int;
did_throw = tstate->did_throw;
- msg_list = (struct msglist **)tstate->msg_list;
- current_exception = tstate->current_exception;
+ need_rethrow = tstate->need_rethrow;
+ did_emsg = tstate->did_emsg;
return ret;
}
diff --git a/src/nvim/api/private/helpers.h b/src/nvim/api/private/helpers.h
index 0b2cf883a6..87f334ac30 100644
--- a/src/nvim/api/private/helpers.h
+++ b/src/nvim/api/private/helpers.h
@@ -88,13 +88,14 @@
/// Used when caller is supposed to be operating when other VimL code is being
/// processed and that “other VimL code” must not be affected.
typedef struct {
+ except_T *current_exception;
+ struct msglist *private_msg_list;
+ const struct msglist *const *msg_list;
int trylevel;
int got_int;
int did_throw;
int need_rethrow;
- except_T *current_exception;
- struct msglist *private_msg_list;
- const struct msglist *const *msg_list;
+ int did_emsg;
} TryState;
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/test/functional/ui/cmdline_highlight_spec.lua b/test/functional/ui/cmdline_highlight_spec.lua
index 0621b990de..6698ced596 100644
--- a/test/functional/ui/cmdline_highlight_spec.lua
+++ b/test/functional/ui/cmdline_highlight_spec.lua
@@ -489,6 +489,44 @@ describe('Ex commands coloring support', function()
|
]])
end)
+ it('does not prevent mapping error from cancelling prompt', function()
+ meths.command("cnoremap <expr> x execute('throw 42')[-1]")
+ feed(':#x')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :# |
+ {ERR:Error detected while processing :} |
+ {ERR:E605: Exception not caught: 42} |
+ :#^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]])
+ eq('\nError detected while processing :\nE605: Exception not caught: 42',
+ meths.command_output('messages'))
+ end)
end)
-- TODO Specifically test for coloring in cmdline and expr modes