summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ex_docmd.c11
-rw-r--r--src/globals.h2
-rw-r--r--src/version.c2
3 files changed, 14 insertions, 1 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index ead520a2..2257c551 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1295,7 +1295,14 @@ do_cmdline(cmdline, fgetline, cookie, flags)
&& cstack.cs_trylevel == 0
#endif
)
- && !(did_emsg && used_getline
+ && !(did_emsg
+#ifdef FEAT_EVAL
+ /* Keep going when inside try/catch, so that the error can be
+ * dealth with, except when it is a syntax error, it may cause
+ * the :endtry to be missed. */
+ && (cstack.cs_trylevel == 0 || did_emsg_syntax)
+#endif
+ && used_getline
&& (getline_equal(fgetline, cookie, getexmodeline)
|| getline_equal(fgetline, cookie, getexline)))
&& (next_cmdline != NULL
@@ -1305,6 +1312,7 @@ do_cmdline(cmdline, fgetline, cookie, flags)
|| (flags & DOCMD_REPEAT)));
vim_free(cmdline_copy);
+ did_emsg_syntax = FALSE;
#ifdef FEAT_EVAL
free_cmdlines(&lines_ga);
ga_clear(&lines_ga);
@@ -2137,6 +2145,7 @@ do_one_cmd(cmdlinep, sourcing,
if (!sourcing)
append_command(*cmdlinep);
errormsg = IObuff;
+ did_emsg_syntax = TRUE;
}
goto doend;
}
diff --git a/src/globals.h b/src/globals.h
index 81cdabba..41eb8859 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -183,6 +183,8 @@ EXTERN int did_endif INIT(= FALSE); /* just had ":endif" */
#endif
EXTERN int did_emsg; /* set by emsg() when the message
is displayed or thrown */
+EXTERN int did_emsg_syntax; /* did_emsg set because of a
+ syntax error */
EXTERN int called_emsg; /* always set by emsg() */
EXTERN int ex_exitval INIT(= 0); /* exit value for ex mode */
EXTERN int emsg_on_display INIT(= FALSE); /* there is an error message */
diff --git a/src/version.c b/src/version.c
index 88836bc4..b22c9010 100644
--- a/src/version.c
+++ b/src/version.c
@@ -720,6 +720,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 637,
+/**/
636,
/**/
635,