1
0
forked from aniani/vim

patch 8.1.0218: cannot add matches to another window

Problem:    Cannot add matches to another window. (Qiming Zhao)
Solution:   Add the "window" argument to matchadd() and matchaddpos().
            (closes #3260)
This commit is contained in:
Bram Moolenaar
2018-07-28 16:55:56 +02:00
parent fd249460fe
commit 95e51470f1
4 changed files with 68 additions and 27 deletions

View File

@@ -6016,7 +6016,7 @@ match({expr}, {pat} [, {start} [, {count}]]) *match()*
the pattern. 'smartcase' is NOT used. The matching is always the pattern. 'smartcase' is NOT used. The matching is always
done like 'magic' is set and 'cpoptions' is empty. done like 'magic' is set and 'cpoptions' is empty.
*matchadd()* *E798* *E799* *E801* *matchadd()* *E798* *E799* *E801* *E957*
matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]]) matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]])
Defines a pattern to be highlighted in the current window (a Defines a pattern to be highlighted in the current window (a
"match"). It will be highlighted with {group}. Returns an "match"). It will be highlighted with {group}. Returns an
@@ -6055,6 +6055,8 @@ matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]])
conceal Special character to show instead of the conceal Special character to show instead of the
match (only for |hl-Conceal| highlighted match (only for |hl-Conceal| highlighted
matches, see |:syn-cchar|) matches, see |:syn-cchar|)
window Instead of the current window use the
window with this number or window ID.
The number of matches is not limited, as it is the case with The number of matches is not limited, as it is the case with
the |:match| commands. the |:match| commands.

View File

@@ -7988,6 +7988,36 @@ f_match(typval_T *argvars, typval_T *rettv)
find_some_match(argvars, rettv, MATCH_MATCH); find_some_match(argvars, rettv, MATCH_MATCH);
} }
#ifdef FEAT_SEARCH_EXTRA
static int
matchadd_dict_arg(typval_T *tv, char_u **conceal_char, win_T **win)
{
dictitem_T *di;
if (tv->v_type != VAR_DICT)
{
EMSG(_(e_dictreq));
return FAIL;
}
if (dict_find(tv->vval.v_dict, (char_u *)"conceal", -1) != NULL)
*conceal_char = get_dict_string(tv->vval.v_dict,
(char_u *)"conceal", FALSE);
if ((di = dict_find(tv->vval.v_dict, (char_u *)"window", -1)) != NULL)
{
*win = find_win_by_nr(&di->di_tv, NULL);
if (*win == NULL)
{
EMSG(_("E957: Invalid window number"));
return FAIL;
}
}
return OK;
}
#endif
/* /*
* "matchadd()" function * "matchadd()" function
*/ */
@@ -8002,6 +8032,7 @@ f_matchadd(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
int id = -1; int id = -1;
int error = FALSE; int error = FALSE;
char_u *conceal_char = NULL; char_u *conceal_char = NULL;
win_T *win = curwin;
rettv->vval.v_number = -1; rettv->vval.v_number = -1;
@@ -8013,19 +8044,10 @@ f_matchadd(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
if (argvars[3].v_type != VAR_UNKNOWN) if (argvars[3].v_type != VAR_UNKNOWN)
{ {
id = (int)get_tv_number_chk(&argvars[3], &error); id = (int)get_tv_number_chk(&argvars[3], &error);
if (argvars[4].v_type != VAR_UNKNOWN) if (argvars[4].v_type != VAR_UNKNOWN
{ && matchadd_dict_arg(&argvars[4], &conceal_char, &win) == FAIL)
if (argvars[4].v_type != VAR_DICT)
{
EMSG(_(e_dictreq));
return; 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; return;
@@ -8035,7 +8057,7 @@ f_matchadd(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
return; return;
} }
rettv->vval.v_number = match_add(curwin, grp, pat, prio, id, NULL, rettv->vval.v_number = match_add(win, grp, pat, prio, id, NULL,
conceal_char); conceal_char);
#endif #endif
} }
@@ -8054,6 +8076,7 @@ f_matchaddpos(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
int error = FALSE; int error = FALSE;
list_T *l; list_T *l;
char_u *conceal_char = NULL; char_u *conceal_char = NULL;
win_T *win = curwin;
rettv->vval.v_number = -1; rettv->vval.v_number = -1;
@@ -8076,19 +8099,11 @@ f_matchaddpos(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
if (argvars[3].v_type != VAR_UNKNOWN) if (argvars[3].v_type != VAR_UNKNOWN)
{ {
id = (int)get_tv_number_chk(&argvars[3], &error); id = (int)get_tv_number_chk(&argvars[3], &error);
if (argvars[4].v_type != VAR_UNKNOWN)
{ if (argvars[4].v_type != VAR_UNKNOWN
if (argvars[4].v_type != VAR_DICT) && matchadd_dict_arg(&argvars[4], &conceal_char, &win) == FAIL)
{
EMSG(_(e_dictreq));
return; 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; return;
@@ -8100,7 +8115,7 @@ f_matchaddpos(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
return; return;
} }
rettv->vval.v_number = match_add(curwin, group, NULL, prio, id, l, rettv->vval.v_number = match_add(win, group, NULL, prio, id, l,
conceal_char); conceal_char);
#endif #endif
} }

View File

@@ -192,6 +192,28 @@ func Test_matchaddpos()
set hlsearch& set hlsearch&
endfunc endfunc
func Test_matchaddpos_otherwin()
syntax on
new
call setline(1, ['12345', 'NP'])
let winid = win_getid()
wincmd w
call matchadd('Search', '4', 10, -1, {'window': winid})
call matchaddpos('Error', [[1,2], [2,2]], 10, -1, {'window': winid})
redraw!
call assert_notequal(screenattr(1,2), 0)
call assert_notequal(screenattr(1,4), 0)
call assert_notequal(screenattr(2,2), 0)
call assert_equal(screenattr(1,2), screenattr(2,2))
call assert_notequal(screenattr(1,2), screenattr(1,4))
wincmd w
bwipe!
call clearmatches()
syntax off
endfunc
func Test_matchaddpos_using_negative_priority() func Test_matchaddpos_using_negative_priority()
set hlsearch set hlsearch

View File

@@ -798,6 +798,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
218,
/**/ /**/
217, 217,
/**/ /**/