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 vim/vim#3260)

95e51470f1
This commit is contained in:
Marco Hinz
2019-04-03 19:57:48 +02:00
parent fb555c6898
commit 6b75d9f865
3 changed files with 60 additions and 25 deletions

View File

@@ -5554,7 +5554,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
@@ -5593,6 +5593,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| highlighed match (only for |hl-Conceal| highlighed
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

@@ -12528,6 +12528,31 @@ static void f_match(typval_T *argvars, typval_T *rettv, FunPtr fptr)
find_some_match(argvars, rettv, kSomeMatch); find_some_match(argvars, rettv, kSomeMatch);
} }
static int matchadd_dict_arg(typval_T *tv, const char **conceal_char,
win_T **win)
{
dictitem_T *di;
if (tv->v_type != VAR_DICT) {
EMSG(_(e_dictreq));
return FAIL;
}
if ((di = tv_dict_find(tv->vval.v_dict, S_LEN("conceal"))) != NULL) {
*conceal_char = tv_get_string(&di->di_tv);
}
if ((di = tv_dict_find(tv->vval.v_dict, S_LEN("window"))) != NULL) {
*win = find_win_by_nr(&di->di_tv, NULL);
if (*win == NULL) {
EMSG(_("E957: Invalid window number"));
return FAIL;
}
}
return OK;
}
/* /*
* "matchadd()" function * "matchadd()" function
*/ */
@@ -12541,6 +12566,7 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
int id = -1; int id = -1;
bool error = false; bool error = false;
const char *conceal_char = NULL; const char *conceal_char = NULL;
win_T *win = curwin;
rettv->vval.v_number = -1; rettv->vval.v_number = -1;
@@ -12551,16 +12577,9 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
prio = tv_get_number_chk(&argvars[2], &error); prio = tv_get_number_chk(&argvars[2], &error);
if (argvars[3].v_type != VAR_UNKNOWN) { if (argvars[3].v_type != VAR_UNKNOWN) {
id = tv_get_number_chk(&argvars[3], &error); id = tv_get_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;
}
dictitem_T *di;
if ((di = tv_dict_find(argvars[4].vval.v_dict, S_LEN("conceal")))
!= NULL) {
conceal_char = tv_get_string(&di->di_tv);
}
} }
} }
} }
@@ -12572,8 +12591,7 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
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);
} }
static void f_matchaddpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) static void f_matchaddpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
@@ -12601,21 +12619,15 @@ static void f_matchaddpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
int prio = 10; int prio = 10;
int id = -1; int id = -1;
const char *conceal_char = NULL; const char *conceal_char = NULL;
win_T *win = curwin;
if (argvars[2].v_type != VAR_UNKNOWN) { if (argvars[2].v_type != VAR_UNKNOWN) {
prio = tv_get_number_chk(&argvars[2], &error); prio = tv_get_number_chk(&argvars[2], &error);
if (argvars[3].v_type != VAR_UNKNOWN) { if (argvars[3].v_type != VAR_UNKNOWN) {
id = tv_get_number_chk(&argvars[3], &error); id = tv_get_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;
}
dictitem_T *di;
if ((di = tv_dict_find(argvars[4].vval.v_dict, S_LEN("conceal")))
!= NULL) {
conceal_char = tv_get_string(&di->di_tv);
}
} }
} }
} }
@@ -12629,8 +12641,7 @@ static void f_matchaddpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
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);
} }
/* /*

View File

@@ -202,6 +202,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