aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/buffer.c1
-rw-r--r--src/nvim/buffer_defs.h1
-rw-r--r--src/nvim/digraph.c2
-rw-r--r--src/nvim/edit.c26
-rw-r--r--src/nvim/eval.c35
-rw-r--r--src/nvim/indent.c2
-rw-r--r--src/nvim/ops.c3
-rw-r--r--src/nvim/option.c11
-rw-r--r--src/nvim/option_defs.h4
-rw-r--r--src/nvim/os/provider.c6
-rw-r--r--src/nvim/regexp.c20
-rw-r--r--src/nvim/regexp_nfa.c41
-rw-r--r--src/nvim/screen.c5
-rw-r--r--src/nvim/search.c20
-rw-r--r--src/nvim/testdir/test100.in8
-rw-r--r--src/nvim/testdir/test100.ok10
-rw-r--r--src/nvim/testdir/test95.in14
-rw-r--r--src/nvim/testdir/test95.ok12
-rw-r--r--src/nvim/version.c16
19 files changed, 182 insertions, 55 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index ee2b1ecf1d..8bcb5934dc 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -1517,6 +1517,7 @@ void free_buf_options(buf_T *buf, int free_p_ff)
clear_string_option(&buf->b_p_qe);
buf->b_p_ar = -1;
buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
+ clear_string_option(&buf->b_p_lw);
}
/*
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index e827642d8a..9f5d7b86eb 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -677,6 +677,7 @@ struct file_buffer {
char_u *b_p_tsr; /* 'thesaurus' local value */
long b_p_ul; /* 'undolevels' local value */
int b_p_udf; /* 'undofile' */
+ char_u *b_p_lw; // 'lispwords' local value
/* end of buffer options */
diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c
index 8edb12526c..f41a16bc1b 100644
--- a/src/nvim/digraph.c
+++ b/src/nvim/digraph.c
@@ -835,6 +835,8 @@ static digr_T digraphdefault[] =
{ 'W', '=', 0x20a9 },
{ '=', 'e', 0x20ac }, // euro
{ 'E', 'u', 0x20ac }, // euro
+ { '=', 'R', 0x20bd }, // rouble
+ { '=', 'P', 0x20bd }, // rouble
{ 'o', 'C', 0x2103 },
{ 'c', 'o', 0x2105 },
{ 'o', 'F', 0x2109 },
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 314af1222f..05d6c9758a 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -3151,7 +3151,9 @@ static int ins_compl_prep(int c)
ins_compl_free();
compl_started = FALSE;
compl_matches = 0;
- msg_clr_cmdline(); /* necessary for "noshowmode" */
+ if (!shortmess(SHM_COMPLETIONMENU)) {
+ msg_clr_cmdline(); // necessary for "noshowmode"
+ }
ctrl_x_mode = 0;
compl_enter_selects = FALSE;
if (edit_submode != NULL) {
@@ -4378,7 +4380,9 @@ static int ins_complete(int c)
if (col == -3) {
ctrl_x_mode = 0;
edit_submode = NULL;
- msg_clr_cmdline();
+ if (!shortmess(SHM_COMPLETIONMENU)) {
+ msg_clr_cmdline();
+ }
return FAIL;
}
@@ -4597,13 +4601,17 @@ static int ins_complete(int c)
/* Show a message about what (completion) mode we're in. */
showmode();
- if (edit_submode_extra != NULL) {
- if (!p_smd)
- msg_attr(edit_submode_extra,
- edit_submode_highl < HLF_COUNT
- ? hl_attr(edit_submode_highl) : 0);
- } else
- msg_clr_cmdline(); /* necessary for "noshowmode" */
+ if (!shortmess(SHM_COMPLETIONMENU)) {
+ if (edit_submode_extra != NULL) {
+ if (!p_smd) {
+ msg_attr(edit_submode_extra,
+ edit_submode_highl < HLF_COUNT
+ ? hl_attr(edit_submode_highl) : 0);
+ }
+ } else {
+ msg_clr_cmdline(); // necessary for "noshowmode"
+ }
+ }
/* Show the popup menu, unless we got interrupted. */
if (!compl_interrupted) {
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 80f7a65d45..7234afc0ce 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -193,6 +193,9 @@ static int current_copyID = 0;
#define COPYID_INC 2
#define COPYID_MASK (~0x1)
+/// Abort conversion to string after a recursion error.
+static bool did_echo_string_emsg = false;
+
/*
* Array to hold the hashtab with variables local to each sourced script.
* Each item holds a variable (nameless) that points to the dict_T.
@@ -5322,6 +5325,9 @@ list_join_inner (
}
line_breakcheck();
+ if (did_echo_string_emsg) { // recursion error, bail out
+ break;
+ }
}
/* Allocate result buffer with its total size, avoid re-allocation and
@@ -5945,8 +5951,10 @@ static char_u *dict2string(typval_T *tv, int copyID)
if (s != NULL)
ga_concat(&ga, s);
free(tofree);
- if (s == NULL)
+ if (s == NULL || did_echo_string_emsg) {
break;
+ }
+ line_breakcheck();
}
}
if (todo > 0) {
@@ -6077,9 +6085,15 @@ static char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int co
char_u *r = NULL;
if (recurse >= DICT_MAXNEST) {
- EMSG(_("E724: variable nested too deep for displaying"));
+ if (!did_echo_string_emsg) {
+ // Only give this message once for a recursive call to avoid
+ // flooding the user with errors. And stop iterating over lists
+ // and dicts.
+ did_echo_string_emsg = true;
+ EMSG(_("E724: variable nested too deep for displaying"));
+ }
*tofree = NULL;
- return NULL;
+ return (char_u *)"{E724}";
}
++recurse;
@@ -6134,7 +6148,9 @@ static char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int co
*tofree = NULL;
}
- --recurse;
+ if (--recurse == 0) {
+ did_echo_string_emsg = false;
+ }
return r;
}
@@ -18009,7 +18025,10 @@ call_user_func (
if (argvars[i].v_type == VAR_NUMBER)
msg_outnum((long)argvars[i].vval.v_number);
else {
+ // Do not want errors such as E724 here.
+ ++emsg_off;
s = tv2string(&argvars[i], &tofree, numbuf2, 0);
+ --emsg_off;
if (s != NULL) {
if (vim_strsize(s) > MSG_BUF_CLEN) {
trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN);
@@ -18091,10 +18110,12 @@ call_user_func (
char_u *tofree;
char_u *s;
- /* The value may be very long. Skip the middle part, so that we
- * have some idea how it starts and ends. smsg() would always
- * truncate it at the end. */
+ // The value may be very long. Skip the middle part, so that we
+ // have some idea how it starts and ends. smsg() would always
+ // truncate it at the end. Don't want errors such as E724 here.
+ ++emsg_off;
s = tv2string(fc->rettv, &tofree, numbuf2, 0);
+ --emsg_off;
if (s != NULL) {
if (vim_strsize(s) > MSG_BUF_CLEN) {
trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN);
diff --git a/src/nvim/indent.c b/src/nvim/indent.c
index ebc5955bae..d4c6b36177 100644
--- a/src/nvim/indent.c
+++ b/src/nvim/indent.c
@@ -690,7 +690,7 @@ static int lisp_match(char_u *p)
{
char_u buf[LSIZE];
int len;
- char_u *word = p_lispwords;
+ char_u *word = *curbuf->b_p_lw != NUL ? curbuf->b_p_lw : p_lispwords;
while (*word != NUL) {
(void)copy_option_part(&word, buf, LSIZE, ",");
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index b4ecb12299..0bf338947b 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -2505,6 +2505,9 @@ int op_yank(oparg_T *oap, int deleting, int mess)
free(y_current->y_array);
y_current = curr;
}
+ if (curwin->w_p_rnu) {
+ redraw_later(SOME_VALID); // cursor moved to start
+ }
if (mess) { /* Display message about yank? */
if (yanktype == MCHAR
&& !oap->block_mode
diff --git a/src/nvim/option.c b/src/nvim/option.c
index ca49a3dcb8..ebbba28b9d 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -143,6 +143,7 @@
# define PV_KMAP OPT_BUF(BV_KMAP)
#define PV_KP OPT_BOTH(OPT_BUF(BV_KP))
# define PV_LISP OPT_BUF(BV_LISP)
+# define PV_LW OPT_BOTH(OPT_BUF(BV_LW))
#define PV_MA OPT_BUF(BV_MA)
#define PV_ML OPT_BUF(BV_ML)
#define PV_MOD OPT_BUF(BV_MOD)
@@ -1057,7 +1058,7 @@ static struct vimoption
(char_u *)&p_lisp, PV_LISP,
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
{"lispwords", "lw", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- (char_u *)&p_lispwords, PV_NONE,
+ (char_u *)&p_lispwords, PV_LW,
{(char_u *)LISPWORD_VALUE, (char_u *)0L}
SCRIPTID_INIT},
{"list", NULL, P_BOOL|P_VI_DEF|P_RWIN,
@@ -3558,6 +3559,7 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_p_tags);
check_string_option(&buf->b_p_dict);
check_string_option(&buf->b_p_tsr);
+ check_string_option(&buf->b_p_lw);
}
/*
@@ -6583,6 +6585,9 @@ void unset_global_local_option(char *name, void *from)
case PV_UL:
buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
break;
+ case PV_LW:
+ clear_string_option(&buf->b_p_lw);
+ break;
}
}
@@ -6612,6 +6617,7 @@ static char_u *get_varp_scope(struct vimoption *p, int opt_flags)
case PV_TSR: return (char_u *)&(curbuf->b_p_tsr);
case PV_STL: return (char_u *)&(curwin->w_p_stl);
case PV_UL: return (char_u *)&(curbuf->b_p_ul);
+ case PV_LW: return (char_u *)&(curbuf->b_p_lw);
}
return NULL; /* "cannot happen" */
}
@@ -6659,6 +6665,8 @@ static char_u *get_varp(struct vimoption *p)
? (char_u *)&(curwin->w_p_stl) : p->var;
case PV_UL: return curbuf->b_p_ul != NO_LOCAL_UNDOLEVEL
? (char_u *)&(curbuf->b_p_ul) : p->var;
+ case PV_LW: return *curbuf->b_p_lw != NUL
+ ? (char_u *)&(curbuf->b_p_lw) : p->var;
case PV_ARAB: return (char_u *)&(curwin->w_p_arab);
case PV_LIST: return (char_u *)&(curwin->w_p_list);
@@ -7011,6 +7019,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_tsr = empty_option;
buf->b_p_qe = vim_strsave(p_qe);
buf->b_p_udf = p_udf;
+ buf->b_p_lw = empty_option;
/*
* Don't copy the options set by ex_help(), use the saved values,
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index a22eec4136..d862ab2761 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -185,7 +185,8 @@
#define SHM_SEARCH 's' /* no search hit bottom messages */
#define SHM_ATTENTION 'A' /* no ATTENTION messages */
#define SHM_INTRO 'I' /* intro messages */
-#define SHM_ALL "rmfixlnwaWtToOsAI" /* all possible flags for 'shm' */
+#define SHM_COMPLETIONMENU 'c' // completion menu messages
+#define SHM_ALL "rmfixlnwaWtToOsAIc" /* all possible flags for 'shm' */
/* characters for p_go: */
#define GO_ASEL 'a' /* autoselect */
@@ -683,6 +684,7 @@ enum {
, BV_KMAP
, BV_KP
, BV_LISP
+ , BV_LW
, BV_MA
, BV_ML
, BV_MOD
diff --git a/src/nvim/os/provider.c b/src/nvim/os/provider.c
index 99cc078e94..d94203f683 100644
--- a/src/nvim/os/provider.c
+++ b/src/nvim/os/provider.c
@@ -158,8 +158,10 @@ static uint64_t get_provider_for(char *method)
err:
// Ensure we won't try to restart the provider
- f->bootstrap_command = NULL;
- f->channel_id = 0;
+ if (f) {
+ f->bootstrap_command = NULL;
+ f->channel_id = 0;
+ }
return 0;
}
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index ba7e4eb2d3..193c68860d 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -258,6 +258,7 @@
#define RE_MARK 207 /* mark cmp Match mark position */
#define RE_VISUAL 208 /* Match Visual area */
+#define RE_COMPOSING 209 // any composing characters
/*
* Magic characters have a special meaning, they don't match literally.
@@ -2024,6 +2025,10 @@ static char_u *regatom(int *flagp)
ret = regnode(RE_VISUAL);
break;
+ case 'C':
+ ret = regnode(RE_COMPOSING);
+ break;
+
/* \%[abc]: Emit as a list of branches, all ending at the last
* branch which matches nothing. */
case '[':
@@ -4099,10 +4104,12 @@ regmatch (
status = RA_NOMATCH;
}
}
- // Check for following composing character.
+ // Check for following composing character, unless %C
+ // follows (skips over all composing chars).
if (status != RA_NOMATCH && enc_utf8
&& UTF_COMPOSINGLIKE(reginput, reginput + len)
- && !ireg_icombine) {
+ && !ireg_icombine
+ && OP(next) != RE_COMPOSING) {
// raaron: This code makes a composing character get
// ignored, which is the correct behavior (sometimes)
// for voweled Hebrew texts.
@@ -4167,6 +4174,15 @@ regmatch (
status = RA_NOMATCH;
break;
+ case RE_COMPOSING:
+ if (enc_utf8) {
+ // Skip composing characters.
+ while (utf_iscomposing(utf_ptr2char(reginput))) {
+ mb_cptr_adv(reginput);
+ }
+ }
+ break;
+
case NOTHING:
break;
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index 21581d3823..2659eac762 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -85,6 +85,7 @@ enum {
NFA_COMPOSING, /* Next nodes in NFA are part of the
composing multibyte char */
NFA_END_COMPOSING, /* End of a composing char in the NFA */
+ NFA_ANY_COMPOSING, // \%C: Any composing characters.
NFA_OPT_CHARS, /* \%[abc] */
/* The following are used only in the postfix form, not in the NFA */
@@ -1350,6 +1351,10 @@ static int nfa_regatom(void)
EMIT(NFA_VISUAL);
break;
+ case 'C':
+ EMIT(NFA_ANY_COMPOSING);
+ break;
+
case '[':
{
int n;
@@ -2259,6 +2264,7 @@ static void nfa_set_code(int c)
case NFA_MARK_LT: STRCPY(code, "NFA_MARK_LT "); break;
case NFA_CURSOR: STRCPY(code, "NFA_CURSOR "); break;
case NFA_VISUAL: STRCPY(code, "NFA_VISUAL "); break;
+ case NFA_ANY_COMPOSING: STRCPY(code, "NFA_ANY_COMPOSING "); break;
case NFA_STAR: STRCPY(code, "NFA_STAR "); break;
case NFA_STAR_NONGREEDY: STRCPY(code, "NFA_STAR_NONGREEDY "); break;
@@ -2716,6 +2722,7 @@ static int nfa_max_width(nfa_state_T *startstate, int depth)
case NFA_NLOWER_IC:
case NFA_UPPER_IC:
case NFA_NUPPER_IC:
+ case NFA_ANY_COMPOSING:
/* possibly non-ascii */
if (has_mbyte)
len += 3;
@@ -3714,6 +3721,7 @@ static int match_follows(nfa_state_T *startstate, int depth)
continue;
case NFA_ANY:
+ case NFA_ANY_COMPOSING:
case NFA_IDENT:
case NFA_SIDENT:
case NFA_KWORD:
@@ -3943,7 +3951,7 @@ skip_add:
#endif
switch (state->c) {
case NFA_MATCH:
- nfa_match = TRUE;
+ //nfa_match = TRUE;
break;
case NFA_SPLIT:
@@ -4573,6 +4581,7 @@ static int failure_chance(nfa_state_T *state, int depth)
case NFA_MATCH:
case NFA_MCLOSE:
+ case NFA_ANY_COMPOSING:
/* empty match works always */
return 0;
@@ -4951,6 +4960,11 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
switch (t->state->c) {
case NFA_MATCH:
{
+ // If the match ends before a composing characters and
+ // ireg_icombine is not set, that is not really a match.
+ if (enc_utf8 && !ireg_icombine && utf_iscomposing(curc)) {
+ break;
+ }
nfa_match = TRUE;
copy_sub(&submatch->norm, &t->subs.norm);
if (nfa_has_zsubexpr)
@@ -5430,6 +5444,18 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
}
break;
+ case NFA_ANY_COMPOSING:
+ // On a composing character skip over it. Otherwise do
+ // nothing. Always matches.
+ if (enc_utf8 && utf_iscomposing(curc)) {
+ add_off = clen;
+ } else {
+ add_here = TRUE;
+ add_off = 0;
+ }
+ add_state = t->state->out;
+ break;
+
/*
* Character classes like \a for alpha, \d for digit etc.
*/
@@ -5769,12 +5795,13 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
if (!result && ireg_ic)
result = vim_tolower(c) == vim_tolower(curc);
- /* If there is a composing character which is not being
- * ignored there can be no match. Match with composing
- * character uses NFA_COMPOSING above. */
- if (result && enc_utf8 && !ireg_icombine
- && clen != utf_char2len(curc))
- result = FALSE;
+
+ // If ireg_icombine is not set only skip over the character
+ // itself. When it is set skip over composing characters.
+ if (result && enc_utf8 && !ireg_icombine) {
+ clen = utf_char2len(curc);
+ }
+
ADD_STATE_IF_MATCH(t->state);
break;
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 1fd872d61c..03c59bf584 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -41,7 +41,7 @@
*
* The part of the buffer that is displayed in a window is set with:
* - w_topline (first buffer line in window)
- * - w_topfill (filler line above the first line)
+ * - w_topfill (filler lines above the first line)
* - w_leftcol (leftmost window cell in window),
* - w_skipcol (skipped window cells of first line)
*
@@ -7341,7 +7341,8 @@ int showmode(void)
attr = hl_attr(HLF_CM); /* Highlight mode */
if (do_mode) {
MSG_PUTS_ATTR("--", attr);
- if (edit_submode != NULL) { /* CTRL-X in Insert mode */
+ // CTRL-X in Insert mode
+ if (edit_submode != NULL && !shortmess(SHM_COMPLETIONMENU)) {
/* These messages can get long, avoid a wrap in a narrow
* window. Prefer showing edit_submode_extra. */
length = (Rows - msg_row) * Columns - 3;
diff --git a/src/nvim/search.c b/src/nvim/search.c
index c995300d56..b0a782a515 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -3015,21 +3015,21 @@ current_block (
}
curwin->w_cursor = *end_pos;
- /*
- * Try to exclude the '(', '{', ')', '}', etc. when "include" is FALSE.
- * If the ending '}' is only preceded by indent, skip that indent.
- * But only if the resulting area is not smaller than what we started with.
- */
+ // Try to exclude the '(', '{', ')', '}', etc. when "include" is FALSE.
+ // If the ending '}', ')' or ']' is only preceded by indent, skip that
+ // indent. But only if the resulting area is not smaller than what we
+ // started with.
while (!include) {
incl(&start_pos);
sol = (curwin->w_cursor.col == 0);
decl(&curwin->w_cursor);
- if (what == '{')
- while (inindent(1)) {
- sol = TRUE;
- if (decl(&curwin->w_cursor) != 0)
- break;
+ while (inindent(1)) {
+ sol = TRUE;
+ if (decl(&curwin->w_cursor) != 0) {
+ break;
}
+ }
+
/*
* In Visual mode, when the resulting area is not bigger than what we
* started with, extend it to the next block, and then exclude again.
diff --git a/src/nvim/testdir/test100.in b/src/nvim/testdir/test100.in
index e42331946c..f9f5f9119f 100644
--- a/src/nvim/testdir/test100.in
+++ b/src/nvim/testdir/test100.in
@@ -37,6 +37,14 @@ STARTTEST
:call UndoLevel()
:%w >> test.out
:"sleep 10
+:"
+:" Testing 'lispwords'
+:"
+:setglobal lispwords=foo,bar,baz
+:setlocal lispwords-=foo | setlocal lispwords+=quux
+:redir >> test.out | echon "\nTesting 'lispwords' local value" | setglobal lispwords? | setlocal lispwords? | echo &lispwords . "\n" | redir end
+:setlocal lispwords<
+:redir >> test.out | echon "\nTesting 'lispwords' value reset" | setglobal lispwords? | setlocal lispwords? | echo &lispwords . "\n" | redir end
:qa!
ENDTEST
diff --git a/src/nvim/testdir/test100.ok b/src/nvim/testdir/test100.ok
index 95b318461c..477106b8f2 100644
--- a/src/nvim/testdir/test100.ok
+++ b/src/nvim/testdir/test100.ok
@@ -39,3 +39,13 @@ THREE: expecting global undolevels: 50, local undolevels: -123456 (default)
undolevels=50 global
undolevels=-123456 local
+
+Testing 'lispwords' local value
+ lispwords=foo,bar,baz
+ lispwords=bar,baz,quux
+bar,baz,quux
+
+Testing 'lispwords' value reset
+ lispwords=foo,bar,baz
+ lispwords=foo,bar,baz
+foo,bar,baz
diff --git a/src/nvim/testdir/test95.in b/src/nvim/testdir/test95.in
index 568563f88d..b2b9de772e 100644
--- a/src/nvim/testdir/test95.in
+++ b/src/nvim/testdir/test95.in
@@ -50,7 +50,11 @@ STARTTEST
:call add(tl, [1, "\u05b9\u05bb", " y\u05b9 x\u05b9\u05bb ", "x\u05b9\u05bb"])
:call add(tl, [2, ".\u05b9\u05bb", " y\u05bb x\u05b9\u05bb ", "x\u05b9\u05bb"])
:call add(tl, [2, "a", "ca\u0300t"])
+:call add(tl, [2, "ca", "ca\u0300t"])
:call add(tl, [2, "a\u0300", "ca\u0300t", "a\u0300"])
+:call add(tl, [2, 'a\%C', "ca\u0300t", "a\u0300"])
+:call add(tl, [2, 'ca\%C', "ca\u0300t", "ca\u0300"])
+:call add(tl, [2, 'ca\%Ct', "ca\u0300t", "ca\u0300t"])
:"""" Test \Z
@@ -90,15 +94,15 @@ STARTTEST
: try
: let l = matchlist(text, pat)
: catch
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"'
: endtry
:" check the match itself
: if len(l) == 0 && len(t) > matchidx
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"'
: elseif len(l) > 0 && len(t) == matchidx
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match'
: elseif len(t) > matchidx && l[0] != t[matchidx]
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"'
: else
: $put ='OK ' . engine . ' - ' . pat
: endif
@@ -111,7 +115,7 @@ STARTTEST
: let e = t[matchidx + i]
: endif
: if l[i] != e
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"'
: endif
: endfor
: unlet i
diff --git a/src/nvim/testdir/test95.ok b/src/nvim/testdir/test95.ok
index e2baee8d29..6762994c12 100644
--- a/src/nvim/testdir/test95.ok
+++ b/src/nvim/testdir/test95.ok
@@ -70,9 +70,21 @@ OK 2 - .ֹֻ
OK 0 - a
OK 1 - a
OK 2 - a
+OK 0 - ca
+OK 1 - ca
+OK 2 - ca
OK 0 - à
OK 1 - à
OK 2 - à
+OK 0 - a\%C
+OK 1 - a\%C
+OK 2 - a\%C
+OK 0 - ca\%C
+OK 1 - ca\%C
+OK 2 - ca\%C
+OK 0 - ca\%Ct
+OK 1 - ca\%Ct
+OK 2 - ca\%Ct
OK 0 - ú\Z
OK 1 - ú\Z
OK 2 - ú\Z
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 3311b78f49..9f0909fb18 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -214,15 +214,15 @@ static int included_patches[] = {
//338,
//337,
//336,
- //335,
+ 335,
//334,
//333,
//332,
- //331,
+ 331,
//330,
//329,
- //328,
- //327,
+ 328,
+ 327,
//326,
//325,
//324,
@@ -235,7 +235,7 @@ static int included_patches[] = {
//317,
//316,
315,
- //314,
+ 314,
//313,
//312,
//311,
@@ -255,8 +255,8 @@ static int included_patches[] = {
//297,
//296,
295,
- //294,
- //293,
+ 294,
+ 293,
292,
291,
290,
@@ -348,7 +348,7 @@ static int included_patches[] = {
204,
203,
//202,
- //201,
+ 201,
//200,
199,
//198,