diff options
-rw-r--r-- | runtime/doc/eval.txt | 13 | ||||
-rw-r--r-- | src/nvim/buffer_defs.h | 15 | ||||
-rw-r--r-- | src/nvim/eval.c | 74 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 2 | ||||
-rw-r--r-- | src/nvim/screen.c | 55 | ||||
-rw-r--r-- | src/nvim/testdir/Makefile | 1 | ||||
-rw-r--r-- | src/nvim/testdir/test_match_conceal.in | 159 | ||||
-rw-r--r-- | src/nvim/testdir/test_match_conceal.ok | 52 | ||||
-rw-r--r-- | src/nvim/version.c | 2 | ||||
-rw-r--r-- | src/nvim/window.c | 20 |
10 files changed, 336 insertions, 57 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index a5f8660691..45980f5d94 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -4598,9 +4598,18 @@ matchadd({group}, {pattern}[, {priority}[, {id}]]) message will appear and the match will not be added. An ID is specified as a positive integer (zero excluded). IDs 1, 2 and 3 are reserved for |:match|, |:2match| and |:3match|, - respectively. If the {id} argument is not specified, + respectively. If the {id} argument is not specified or -1, |matchadd()| automatically chooses a free ID. + The optional {dict} argmument allows for further custom + values. Currently this is used to specify a match specifc + conceal character that will be shown for |hl-Conceal| + highlighted matches. The dict can have the following members: + + conceal Special character to show instead of the + match (only for |hl-Conceal| highlighed + matches, see |:syn-cchar|) + The number of matches is not limited, as it is the case with the |:match| commands. @@ -4614,7 +4623,7 @@ matchadd({group}, {pattern}[, {priority}[, {id}]]) available from |getmatches()|. All matches can be deleted in one operation by |clearmatches()|. -matchaddpos({group}, {pos}[, {priority}[, {id}]]) *matchaddpos()* +matchaddpos({group}, {pos}[, {priority}[, {id}[, {dict}]]]) *matchaddpos()* Same as |matchadd()|, but requires a list of positions {pos} instead of a pattern. This command is faster than |matchadd()| because it does not require to handle regular expressions and diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index 78d9a9484e..709ff3dd0d 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -904,13 +904,14 @@ struct posmatch typedef struct matchitem matchitem_T; struct matchitem { matchitem_T *next; - int id; /* match ID */ - int priority; /* match priority */ - char_u *pattern; /* pattern to highlight */ - int hlg_id; /* highlight group ID */ - regmmatch_T match; /* regexp program for pattern */ - posmatch_T pos; // position matches - match_T hl; /* struct for doing the actual highlighting */ + int id; ///< match ID + int priority; ///< match priority + char_u *pattern; ///< pattern to highlight + int hlg_id; ///< highlight group ID + regmmatch_T match; ///< regexp program for pattern + posmatch_T pos; ///< position matches + match_T hl; ///< struct for doing the actual highlighting + int conceal_char; ///< cchar for Conceal highlighting }; /* diff --git a/src/nvim/eval.c b/src/nvim/eval.c index b9b913a969..327d0bf637 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -7270,8 +7270,8 @@ static struct fst { { "maparg", 1, 4, f_maparg }, { "mapcheck", 1, 3, f_mapcheck }, { "match", 2, 4, f_match }, - { "matchadd", 2, 4, f_matchadd }, - { "matchaddpos", 2, 4, f_matchaddpos }, + { "matchadd", 2, 5, f_matchadd }, + { "matchaddpos", 2, 5, f_matchaddpos }, { "matcharg", 1, 1, f_matcharg }, { "matchdelete", 1, 1, f_matchdelete }, { "matchend", 2, 4, f_matchend }, @@ -10422,6 +10422,14 @@ static void f_getmatches(typval_T *argvars, typval_T *rettv) dict_add_nr_str(dict, "group", 0L, syn_id2name(cur->hlg_id)); dict_add_nr_str(dict, "priority", (long)cur->priority, NULL); dict_add_nr_str(dict, "id", (long)cur->id, NULL); + + if (cur->conceal_char) { + char_u buf[MB_MAXBYTES + 1]; + + buf[(*mb_char2bytes)((int)cur->conceal_char, buf)] = NUL; + dict_add_nr_str(dict, "conceal", 0L, (char_u *)&buf); + } + list_append_dict(rettv->vval.v_list, dict); cur = cur->next; } @@ -12487,7 +12495,8 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv) char_u *pat = get_tv_string_buf_chk(&argvars[1], buf); /* pattern */ int prio = 10; /* default priority */ int id = -1; - int error = FALSE; + int error = false; + char_u *conceal_char = NULL; rettv->vval.v_number = -1; @@ -12495,17 +12504,31 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv) return; if (argvars[2].v_type != VAR_UNKNOWN) { prio = get_tv_number_chk(&argvars[2], &error); - if (argvars[3].v_type != VAR_UNKNOWN) + if (argvars[3].v_type != VAR_UNKNOWN) { id = get_tv_number_chk(&argvars[3], &error); + if (argvars[4].v_type != VAR_UNKNOWN) { + if (argvars[4].v_type != VAR_DICT) { + EMSG(_(e_dictreq)); + return; + } + if (dict_find(argvars[4].vval.v_dict, + (char_u *)"conceal", -1) != NULL) { + conceal_char = get_dict_string(argvars[4].vval.v_dict, + (char_u *)"conceal", false); + } + } + } } - if (error == TRUE) + if (error == true) { return; + } if (id >= 1 && id <= 3) { EMSGN("E798: ID is reserved for \":match\": %" PRId64, id); return; } - rettv->vval.v_number = match_add(curwin, grp, pat, prio, id, NULL); + rettv->vval.v_number = match_add(curwin, grp, pat, prio, id, NULL, + conceal_char); } static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL @@ -12533,12 +12556,24 @@ static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ int error = false; int prio = 10; int id = -1; + char_u *conceal_char = NULL; if (argvars[2].v_type != VAR_UNKNOWN) { - prio = get_tv_number_chk(&argvars[2], &error); - if (argvars[3].v_type != VAR_UNKNOWN) { - id = get_tv_number_chk(&argvars[3], &error); + prio = get_tv_number_chk(&argvars[2], &error); + if (argvars[3].v_type != VAR_UNKNOWN) { + id = get_tv_number_chk(&argvars[3], &error); + if (argvars[4].v_type != VAR_UNKNOWN) { + if (argvars[4].v_type != VAR_DICT) { + EMSG(_(e_dictreq)); + return; + } + if (dict_find(argvars[4].vval.v_dict, + (char_u *)"conceal", -1) != NULL) { + conceal_char = get_dict_string(argvars[4].vval.v_dict, + (char_u *)"conceal", false); + } } + } } if (error == true) { return; @@ -12550,7 +12585,8 @@ static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ return; } - rettv->vval.v_number = match_add(curwin, group, NULL, prio, id, l); + rettv->vval.v_number = match_add(curwin, group, NULL, prio, id, l, + conceal_char); } /* @@ -15259,8 +15295,8 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv) int i = 0; char_u buf[5]; dictitem_T *di; - d = li->li_tv.vval.v_dict; + d = li->li_tv.vval.v_dict; if (dict_find(d, (char_u *)"pattern", -1) == NULL) { if (s == NULL) { s = list_alloc(); @@ -15285,15 +15321,19 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv) } } + char_u *group = get_dict_string(d, (char_u *)"group", false); + int priority = get_dict_number(d, (char_u *)"priority"); + int id = get_dict_number(d, (char_u *)"id"); + char_u *conceal = dict_find(d, (char_u *)"conceal", -1) != NULL + ? get_dict_string(d, (char_u *)"conceal", + false) + : NULL; if (i == 0) { - match_add(curwin, get_dict_string(d, (char_u *)"group", false), + match_add(curwin, group, get_dict_string(d, (char_u *)"pattern", false), - (int)get_dict_number(d, (char_u *)"priority"), - (int)get_dict_number(d, (char_u *)"id"), NULL); + priority, id, NULL, conceal); } else { - match_add(curwin, get_dict_string(d, (char_u *)"group", false), - NULL, (int)get_dict_number(d, (char_u *)"priority"), - (int)get_dict_number(d, (char_u *)"id"), s); + match_add(curwin, group, NULL, priority, id, s, conceal); list_unref(s); s = NULL; } diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index d6976bcb8f..417c30b2eb 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -9388,7 +9388,7 @@ static void ex_match(exarg_T *eap) c = *end; *end = NUL; - match_add(curwin, g, p + 1, 10, id, NULL); + match_add(curwin, g, p + 1, 10, id, NULL, NULL); xfree(g); *end = c; } diff --git a/src/nvim/screen.c b/src/nvim/screen.c index e036c49be4..7495647ff2 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -2199,11 +2199,13 @@ win_line ( int syntax_seqnr = 0; int prev_syntax_id = 0; int conceal_attr = hl_attr(HLF_CONCEAL); - int is_concealing = FALSE; - int boguscols = 0; /* nonexistent columns added to force - wrapping */ - int vcol_off = 0; /* offset for concealed characters */ - int did_wcol = FALSE; + int is_concealing = false; + int boguscols = 0; ///< nonexistent columns added to + ///< force wrapping + int vcol_off = 0; ///< offset for concealed characters + int did_wcol = false; + int match_conc = false; ///< cchar for match functions + int has_match_conc = false; ///< match wants to conceal int old_boguscols = 0; # define VCOL_HLC (vcol - vcol_off) # define FIX_FOR_BOGUSCOLS \ @@ -2633,11 +2635,10 @@ win_line ( extra_check = true; } - /* - * Repeat for the whole displayed line. - */ + // Repeat for the whole displayed line. for (;; ) { - /* Skip this quickly when working on the text. */ + has_match_conc = false; + // Skip this quickly when working on the text. if (draw_state != WL_LINE) { if (draw_state == WL_CMDLINE - 1 && n_extra == 0) { draw_state = WL_CMDLINE; @@ -2884,8 +2885,16 @@ win_line ( shl->endcol = tmp_col; } shl->attr_cur = shl->attr; + if (cur != NULL && syn_name2id((char_u *)"Conceal") + == cur->hlg_id) { + has_match_conc = true; + match_conc = cur->conceal_char; + } else { + has_match_conc = match_conc = false; + } } else if (v == (long)shl->endcol) { shl->attr_cur = 0; + prev_syntax_id = 0; next_search_hl(wp, shl, lnum, (colnr_T)v, cur); pos_inprogress = !(cur == NULL || cur->pos.cur == 0); @@ -3602,24 +3611,28 @@ win_line ( } } - if ( wp->w_p_cole > 0 - && (wp != curwin || lnum != wp->w_cursor.lnum || - conceal_cursor_line(wp)) - && (syntax_flags & HL_CONCEAL) != 0 - && !(lnum_in_visual_area - && vim_strchr(wp->w_p_cocu, 'v') == NULL)) { + if (wp->w_p_cole > 0 + && (wp != curwin || lnum != wp->w_cursor.lnum || + conceal_cursor_line(wp)) + && ((syntax_flags & HL_CONCEAL) != 0 || has_match_conc) + && !(lnum_in_visual_area + && vim_strchr(wp->w_p_cocu, 'v') == NULL)) { char_attr = conceal_attr; if (prev_syntax_id != syntax_seqnr - && (syn_get_sub_char() != NUL || wp->w_p_cole == 1) + && (syn_get_sub_char() != NUL || match_conc + || wp->w_p_cole == 1) && wp->w_p_cole != 3) { - /* First time at this concealed item: display one - * character. */ - if (syn_get_sub_char() != NUL) + // First time at this concealed item: display one + // character. + if (match_conc) { + c = match_conc; + } else if (syn_get_sub_char() != NUL) { c = syn_get_sub_char(); - else if (lcs_conceal != NUL) + } else if (lcs_conceal != NUL) { c = lcs_conceal; - else + } else { c = ' '; + } prev_syntax_id = syntax_seqnr; diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile index d1a7abfbf7..7495508a80 100644 --- a/src/nvim/testdir/Makefile +++ b/src/nvim/testdir/Makefile @@ -29,6 +29,7 @@ SCRIPTS := \ test_close_count.out \ test_command_count.out \ test_marks.out \ + test_match_conceal.out \ NEW_TESTS = diff --git a/src/nvim/testdir/test_match_conceal.in b/src/nvim/testdir/test_match_conceal.in new file mode 100644 index 0000000000..aa32b8582b --- /dev/null +++ b/src/nvim/testdir/test_match_conceal.in @@ -0,0 +1,159 @@ +Test for matchadd() and conceal feature + +STARTTEST +:so small.vim +:if !has("conceal") | e! test.ok | w! test.out | qa! | endif +:set term=ansi +:so mbyte.vim +:if &enc !=? 'utf-8'|:e! test.ok|:w! test.out|qa!|endif +:10new|:vsp|:vert resize 20 +:put =\"\#\ This\ is\ a\ Test\" +:norm! mazt +:fu! ScreenChar(width, lines) +: let c='' +: for j in range(1,a:lines) +: for i in range(1,a:width) +: let c.=nr2char(screenchar(j, i)) +: endfor +: let c.="\n" +: endfor +: return c +:endfu +:fu! ScreenAttr(line, pos, eval) +: let g:attr=[] +: for col in a:pos +: call add(g:attr, screenattr(a:line,col)) +: endfor +: " In case all values are zero, probably the terminal +: " isn't set correctly, so catch that case +: let null = (eval(join(g:attr, '+')) == 0) +: let str=substitute(a:eval, '\d\+', 'g:attr[&]', 'g') +: if null || eval(str) +: :let g:attr_test="OK: ". str +: else +: :let g:attr_test="FAILED: ".str +: :let g:attr_test.="\n". join(g:attr, ' ') +: :let g:attr_test.="\n TERM: ". &term +: endif +:endfu +:fu! DoRecordScreen() +: wincmd l +: $put =printf(\"\n%s\", g:test) +: $put =g:line +: $put =g:attr_test +: wincmd p +:endfu +:let g:test ="Test 1: simple addmatch()" +:call matchadd('Conceal', '\%2l ') +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +: +:let g:test ="Test 2: simple addmatch() and conceal (should be: #XThisXisXaXTest)" +:norm! 'azt +:call clearmatches() +:syntax on +:set concealcursor=n conceallevel=1 +:call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +: +:let g:test ="Test 3: addmatch() and conceallevel=3 (should be: #ThisisaTest)" +:norm! 'azt +:set conceallevel=3 +:call clearmatches() +:call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 1==2 && 1==3 && 1==4 && 0!=5") +:call DoRecordScreen() +: +:let g:test ="Test 4: more match() (should be: #Thisisa Test)" +:norm! 'azt +:call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'}) +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 1==2 && 0!=3 && 3==4 && 0!=5 && 3!=5") +:call DoRecordScreen() +: +:let g:test ="Test 5/1: default conceal char (should be: # This is a Test)" +:norm! 'azt +:call clearmatches() +:set conceallevel=1 +:call matchadd('Conceal', '\%2l ', 10, -1, {}) +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +:let g:test ="Test 5/2: default conceal char (should be: #+This+is+a+Test)" +:norm! 'azt +:set listchars=conceal:+ +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +:set listchars&vim +: +:let g:test ="Test 6/1: syn and match conceal (should be: #ZThisZisZaZTest)" +:norm! 'azt +:call clearmatches() +:set conceallevel=1 +:call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'}) +:syn match MyConceal /\%2l / conceal containedin=ALL cchar=* +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +:let g:test ="Test 6/2: syn and match conceal (should be: #*This*is*a*Test)" +:norm! 'azt +:call clearmatches() +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +: +:let g:test ="Test 7/1: clear matches" +:norm! 'azt +:syn on +:call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'}) +:let a=getmatches() +:call clearmatches() +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 0==2 && 0==3 && 0==4 && 0==5") +:call DoRecordScreen() +:$put =a +:call setmatches(a) +:norm! 'azt +:let g:test ="Test 7/2: reset match using setmatches()" +:norm! 'azt +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +: +:let g:test ="Test 8: using matchaddpos() (should be #Pis a Test" +:norm! 'azt +:call clearmatches() +:call matchaddpos('Conceal', [[2,2,6]], 10, -1, {'conceal': 'P'}) +:let a=getmatches() +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1!=2 && 0==2 && 0==3 && 0!=4 && 0!=5 && 4==5") +:call DoRecordScreen() +:$put =a +: +:let g:test ="Test 9: match using multibyte conceal char (should be: #ˑThisˑisˑaˑTest)" +:norm! 'azt +:call clearmatches() +:call matchadd('Conceal', '\%2l ', 20, -1, {'conceal': "\u02d1"}) +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5") +:call DoRecordScreen() +: +:"sleep 10 +:%w! test.out +:qa! +ENDTEST +dummy text diff --git a/src/nvim/testdir/test_match_conceal.ok b/src/nvim/testdir/test_match_conceal.ok new file mode 100644 index 0000000000..11c379e2f8 --- /dev/null +++ b/src/nvim/testdir/test_match_conceal.ok @@ -0,0 +1,52 @@ + +# This is a Test + +Test 1: simple addmatch() +# This is a Test +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] + +Test 2: simple addmatch() and conceal (should be: #XThisXisXaXTest) +#XThisXisXaXTest +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] + +Test 3: addmatch() and conceallevel=3 (should be: #ThisisaTest) +#ThisisaTest +OK: g:attr[0]==g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]!=g:attr[5] + +Test 4: more match() (should be: #Thisisa Test) +#Thisisa Test +OK: g:attr[0]==g:attr[1] && g:attr[1]==g:attr[2] && g:attr[0]!=g:attr[3] && g:attr[3]==g:attr[4] && g:attr[0]!=g:attr[5] && g:attr[3]!=g:attr[5] + +Test 5/1: default conceal char (should be: # This is a Test) +# This is a Test +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] + +Test 5/2: default conceal char (should be: #+This+is+a+Test) +#+This+is+a+Test +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] + +Test 6/1: syn and match conceal (should be: #ZThisZisZaZTest) +#ZThisZisZaZTest +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] + +Test 6/2: syn and match conceal (should be: #*This*is*a*Test) +#*This*is*a*Test +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] + +Test 7/1: clear matches +# This is a Test +OK: g:attr[0]==g:attr[1] && g:attr[0]==g:attr[2] && g:attr[0]==g:attr[3] && g:attr[0]==g:attr[4] && g:attr[0]==g:attr[5] +{'group': 'Conceal', 'pattern': '\%2l ', 'priority': 10, 'id': 10, 'conceal': 'Z'} + +Test 7/2: reset match using setmatches() +#ZThisZisZaZTest +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] + +Test 8: using matchaddpos() (should be #Pis a Test +#Pis a Test +OK: g:attr[0]!=g:attr[1] && g:attr[1]!=g:attr[2] && g:attr[0]==g:attr[2] && g:attr[0]==g:attr[3] && g:attr[0]!=g:attr[4] && g:attr[0]!=g:attr[5] && g:attr[4]==g:attr[5] +{'group': 'Conceal', 'id': 11, 'priority': 10, 'pos1': [2, 2, 6], 'conceal': 'P'} + +Test 9: match using multibyte conceal char (should be: #ˑThisˑisˑaˑTest) +#ˑThisˑisˑaˑTest +OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5] diff --git a/src/nvim/version.c b/src/nvim/version.c index 487f3fc27b..56c1f317c5 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -496,7 +496,7 @@ static int included_patches[] = { 795, // 794 NA 793, - // 792, + 792, 791, 790, 789, diff --git a/src/nvim/window.c b/src/nvim/window.c index e84d8df36b..36cb48f3a1 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -5342,14 +5342,14 @@ void restore_buffer(buf_T *save_curbuf) } -/* - * Add match to the match list of window 'wp'. The pattern 'pat' will be - * highlighted with the group 'grp' with priority 'prio'. - * Optionally, a desired ID 'id' can be specified (greater than or equal to 1). - * If no particular ID is desired, -1 must be specified for 'id'. - * Return ID of added match, -1 on failure. - */ -int match_add(win_T *wp, char_u *grp, char_u *pat, int prio, int id, list_T *pos_list) +// Add match to the match list of window 'wp'. The pattern 'pat' will be +// highlighted with the group 'grp' with priority 'prio'. +// Optionally, a desired ID 'id' can be specified (greater than or equal to 1). +// If no particular ID is desired, -1 must be specified for 'id'. +// Return ID of added match, -1 on failure. +int match_add(win_T *wp, char_u *grp, char_u *pat, + int prio, int id, list_T *pos_list, + char_u *conceal_char) { matchitem_T *cur; matchitem_T *prev; @@ -5405,6 +5405,10 @@ int match_add(win_T *wp, char_u *grp, char_u *pat, int prio, int id, list_T *pos m->match.regprog = regprog; m->match.rmm_ic = FALSE; m->match.rmm_maxcol = 0; + m->conceal_char = 0; + if (conceal_char != NULL) { + m->conceal_char = (*mb_ptr2char)(conceal_char); + } // Set up position matches if (pos_list != NULL) |