diff options
author | Jurica Bradaric <jbradaric@gmail.com> | 2016-01-30 11:33:20 +0100 |
---|---|---|
committer | Jurica Bradaric <jbradaric@gmail.com> | 2016-01-30 12:16:32 +0100 |
commit | f8ad215d25e6bbaafbb309b9d844209b78eb6d48 (patch) | |
tree | 21cf9adbfa6479f4cbfaf75067c99f7661468b08 /src | |
parent | 8f22031708b351ec5bb73952e6afc39b07a72ae2 (diff) | |
download | rneovim-f8ad215d25e6bbaafbb309b9d844209b78eb6d48.tar.gz rneovim-f8ad215d25e6bbaafbb309b9d844209b78eb6d48.tar.bz2 rneovim-f8ad215d25e6bbaafbb309b9d844209b78eb6d48.zip |
vim-patch:7.4.745
Problem: The entries added by matchaddpos() are returned by getmatches()
but can't be set with setmatches(). (Lcd)
Solution: Fix setmatches(). (Christian Brabandt)
https://github.com/vim/vim/commit/0fce4257727f9d75e488963b73e407d31dd46546
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 48 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
2 files changed, 44 insertions, 6 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index a1c5f958d1..d5dc694f6a 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -15209,6 +15209,7 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv) list_T *l; listitem_T *li; dict_T *d; + list_T *s = NULL; rettv->vval.v_number = -1; if (argvars[0].v_type != VAR_LIST) { @@ -15227,7 +15228,8 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv) return; } if (!(dict_find(d, (char_u *)"group", -1) != NULL - && dict_find(d, (char_u *)"pattern", -1) != NULL + && (dict_find(d, (char_u *)"pattern", -1) != NULL + || dict_find(d, (char_u *)"pos1", -1) != NULL) && dict_find(d, (char_u *)"priority", -1) != NULL && dict_find(d, (char_u *)"id", -1) != NULL)) { EMSG(_(e_invarg)); @@ -15239,11 +15241,47 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv) clear_matches(curwin); li = l->lv_first; while (li != NULL) { + int i = 0; + char_u buf[4]; + dictitem_T *di; d = li->li_tv.vval.v_dict; - match_add(curwin, get_dict_string(d, (char_u *)"group", FALSE), - 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); + + if (dict_find(d, (char_u *)"pattern", -1) == NULL) { + if (s == NULL) { + s = list_alloc(); + if (s == NULL) { + return; + } + } + + // match from matchaddpos() + for (i = 1; i < 9; ++i) { + sprintf((char *)buf, (char *)"pos%d", i); + if ((di = dict_find(d, (char_u *)buf, -1)) != NULL) { + if (di->di_tv.v_type != VAR_LIST) { + return; + } + + list_append_tv(s, &di->di_tv); + s->lv_refcount++; + } else { + break; + } + } + } + + if (i == 0) { + match_add(curwin, get_dict_string(d, (char_u *)"group", FALSE), + 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); + } 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); + list_unref(s); + s = NULL; + } li = li->li_next; } rettv->vval.v_number = 0; diff --git a/src/nvim/version.c b/src/nvim/version.c index 30f104562f..33aa680ca3 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -389,7 +389,7 @@ static int included_patches[] = { // 748, // 747, // 746, - // 745, + 745, // 744 NA // 743, // 742, |