@@ -622,6 +622,7 @@ static void f_maparg __ARGS((typval_T *argvars, typval_T *rettv));
622622static void f_mapcheck __ARGS((typval_T *argvars, typval_T *rettv));
623623static void f_match __ARGS((typval_T *argvars, typval_T *rettv));
624624static void f_matchadd __ARGS((typval_T *argvars, typval_T *rettv));
625+ static void f_matchaddpos __ARGS((typval_T *argvars, typval_T *rettv));
625626static void f_matcharg __ARGS((typval_T *argvars, typval_T *rettv));
626627static void f_matchdelete __ARGS((typval_T *argvars, typval_T *rettv));
627628static void f_matchend __ARGS((typval_T *argvars, typval_T *rettv));
@@ -8054,6 +8055,7 @@ static struct fst
80548055 {"mapcheck", 1, 3, f_mapcheck},
80558056 {"match", 2, 4, f_match},
80568057 {"matchadd", 2, 4, f_matchadd},
8058+ {"matchaddpos", 2, 4, f_matchaddpos},
80578059 {"matcharg", 1, 1, f_matcharg},
80588060 {"matchdelete", 1, 1, f_matchdelete},
80598061 {"matchend", 2, 4, f_matchend},
@@ -11767,6 +11769,7 @@ f_getmatches(argvars, rettv)
1176711769#ifdef FEAT_SEARCH_EXTRA
1176811770 dict_T *dict;
1176911771 matchitem_T *cur = curwin->w_match_head;
11772+ int i;
1177011773
1177111774 if (rettv_list_alloc(rettv) == OK)
1177211775 {
@@ -11775,8 +11778,36 @@ f_getmatches(argvars, rettv)
1177511778 dict = dict_alloc();
1177611779 if (dict == NULL)
1177711780 return;
11781+ if (cur->match.regprog == NULL)
11782+ {
11783+ /* match added with matchaddpos() */
11784+ for (i = 0; i < MAXPOSMATCH; ++i)
11785+ {
11786+ llpos_T *llpos;
11787+ char buf[6];
11788+ list_T *l;
11789+
11790+ llpos = &cur->pos.pos[i];
11791+ if (llpos->lnum == 0)
11792+ break;
11793+ l = list_alloc();
11794+ if (l == NULL)
11795+ break;
11796+ list_append_number(l, (varnumber_T)llpos->lnum);
11797+ if (llpos->col > 0)
11798+ {
11799+ list_append_number(l, (varnumber_T)llpos->col);
11800+ list_append_number(l, (varnumber_T)llpos->len);
11801+ }
11802+ sprintf(buf, "pos%d", i + 1);
11803+ dict_add_list(dict, buf, l);
11804+ }
11805+ }
11806+ else
11807+ {
11808+ dict_add_nr_str(dict, "pattern", 0L, cur->pattern);
11809+ }
1177811810 dict_add_nr_str(dict, "group", 0L, syn_id2name(cur->hlg_id));
11779- dict_add_nr_str(dict, "pattern", 0L, cur->pattern);
1178011811 dict_add_nr_str(dict, "priority", (long)cur->priority, NULL);
1178111812 dict_add_nr_str(dict, "id", (long)cur->id, NULL);
1178211813 list_append_dict(rettv->vval.v_list, dict);
@@ -14313,7 +14344,58 @@ f_matchadd(argvars, rettv)
1431314344 return;
1431414345 }
1431514346
14316- rettv->vval.v_number = match_add(curwin, grp, pat, prio, id);
14347+ rettv->vval.v_number = match_add(curwin, grp, pat, prio, id, NULL);
14348+ #endif
14349+ }
14350+
14351+ /*
14352+ * "matchaddpos()" function
14353+ */
14354+ static void
14355+ f_matchaddpos(argvars, rettv)
14356+ typval_T *argvars UNUSED;
14357+ typval_T *rettv UNUSED;
14358+ {
14359+ #ifdef FEAT_SEARCH_EXTRA
14360+ char_u buf[NUMBUFLEN];
14361+ char_u *group;
14362+ int prio = 10;
14363+ int id = -1;
14364+ int error = FALSE;
14365+ list_T *l;
14366+
14367+ rettv->vval.v_number = -1;
14368+
14369+ group = get_tv_string_buf_chk(&argvars[0], buf);
14370+ if (group == NULL)
14371+ return;
14372+
14373+ if (argvars[1].v_type != VAR_LIST)
14374+ {
14375+ EMSG2(_(e_listarg), "matchaddpos()");
14376+ return;
14377+ }
14378+ l = argvars[1].vval.v_list;
14379+ if (l == NULL)
14380+ return;
14381+
14382+ if (argvars[2].v_type != VAR_UNKNOWN)
14383+ {
14384+ prio = get_tv_number_chk(&argvars[2], &error);
14385+ if (argvars[3].v_type != VAR_UNKNOWN)
14386+ id = get_tv_number_chk(&argvars[3], &error);
14387+ }
14388+ if (error == TRUE)
14389+ return;
14390+
14391+ /* id == 3 is ok because matchaddpos() is supposed to substitute :3match */
14392+ if (id == 1 || id == 2)
14393+ {
14394+ EMSGN("E798: ID is reserved for \":match\": %ld", id);
14395+ return;
14396+ }
14397+
14398+ rettv->vval.v_number = match_add(curwin, group, NULL, prio, id, l);
1431714399#endif
1431814400}
1431914401
@@ -16816,7 +16898,7 @@ f_setmatches(argvars, rettv)
1681616898 match_add(curwin, get_dict_string(d, (char_u *)"group", FALSE),
1681716899 get_dict_string(d, (char_u *)"pattern", FALSE),
1681816900 (int)get_dict_number(d, (char_u *)"priority"),
16819- (int)get_dict_number(d, (char_u *)"id"));
16901+ (int)get_dict_number(d, (char_u *)"id"), NULL );
1682016902 li = li->li_next;
1682116903 }
1682216904 rettv->vval.v_number = 0;
0 commit comments