diff options
Diffstat (limited to 'data/vim/patches/8.1.1084')
-rw-r--r-- | data/vim/patches/8.1.1084 | 633 |
1 files changed, 633 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1084 b/data/vim/patches/8.1.1084 new file mode 100644 index 000000000..9589667e4 --- /dev/null +++ b/data/vim/patches/8.1.1084 @@ -0,0 +1,633 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1084 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1084 +Problem: Cannot delete a match from another window. (Paul Jolly) +Solution: Add window ID argument to matchdelete(), clearmatches(), + getmatches() and setmatches(). (Andy Massimino, closes #4178) +Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_match.vim + +*** ../vim-8.1.1083/runtime/doc/eval.txt 2019-03-29 14:16:34.138861795 +0100 +--- runtime/doc/eval.txt 2019-03-30 17:50:40.288425654 +0100 +*************** +*** 2237,2243 **** + changenr() Number current change number + char2nr({expr} [, {utf8}]) Number ASCII/UTF8 value of first char in {expr} + cindent({lnum}) Number C indent for line {lnum} +! clearmatches() none clear all matches + col({expr}) Number column nr of cursor or mark + complete({startcol}, {matches}) none set Insert mode completion + complete_add({expr}) Number add completion match +--- 2265,2271 ---- + changenr() Number current change number + char2nr({expr} [, {utf8}]) Number ASCII/UTF8 value of first char in {expr} + cindent({lnum}) Number C indent for line {lnum} +! clearmatches([{win}]) none clear all matches + col({expr}) Number column nr of cursor or mark + complete({startcol}, {matches}) none set Insert mode completion + complete_add({expr}) Number add completion match +*************** +*** 2331,2337 **** + getline({lnum}) String line {lnum} of current buffer + getline({lnum}, {end}) List lines {lnum} to {end} of current buffer + getloclist({nr} [, {what}]) List list of location list items +! getmatches() List list of current matches + getpid() Number process ID of Vim + getpos({expr}) List position of cursor, mark, etc. + getqflist([{what}]) List list of quickfix items +--- 2359,2365 ---- + getline({lnum}) String line {lnum} of current buffer + getline({lnum}, {end}) List lines {lnum} to {end} of current buffer + getloclist({nr} [, {what}]) List list of location list items +! getmatches([{win}]) List list of current matches + getpid() Number process ID of Vim + getpos({expr}) List position of cursor, mark, etc. + getqflist([{what}]) List list of quickfix items +*************** +*** 2422,2428 **** + matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]]) + Number highlight positions with {group} + matcharg({nr}) List arguments of |:match| +! matchdelete({id}) Number delete match identified by {id} + matchend({expr}, {pat} [, {start} [, {count}]]) + Number position where {pat} ends in {expr} + matchlist({expr}, {pat} [, {start} [, {count}]]) +--- 2450,2456 ---- + matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]]) + Number highlight positions with {group} + matcharg({nr}) List arguments of |:match| +! matchdelete({id} [, {win}]) Number delete match identified by {id} + matchend({expr}, {pat} [, {start} [, {count}]]) + Number position where {pat} ends in {expr} + matchlist({expr}, {pat} [, {start} [, {count}]]) +*************** +*** 2528,2534 **** + setline({lnum}, {line}) Number set line {lnum} to {line} + setloclist({nr}, {list} [, {action} [, {what}]]) + Number modify location list using {list} +! setmatches({list}) Number restore a list of matches + setpos({expr}, {list}) Number set the {expr} position to {list} + setqflist({list} [, {action} [, {what}]]) + Number modify quickfix list using {list} +--- 2556,2562 ---- + setline({lnum}, {line}) Number set line {lnum} to {line} + setloclist({nr}, {list} [, {action} [, {what}]]) + Number modify location list using {list} +! setmatches({list} [, {win}]) Number restore a list of matches + setpos({expr}, {list}) Number set the {expr} position to {list} + setqflist({list} [, {action} [, {what}]]) + Number modify quickfix list using {list} +*************** +*** 3428,3436 **** + feature, -1 is returned. + See |C-indenting|. + +! clearmatches() *clearmatches()* +! Clears all matches previously defined by |matchadd()| and the +! |:match| commands. + + *col()* + col({expr}) The result is a Number, which is the byte index of the column +--- 3461,3471 ---- + feature, -1 is returned. + See |C-indenting|. + +! clearmatches([{win}]) *clearmatches()* +! Clears all matches previously defined for the current window +! by |matchadd()| and the |:match| commands. +! If {win} is specified, use the window with this number or +! window ID instead of the current window. + + *col()* + col({expr}) The result is a Number, which is the byte index of the column +*************** +*** 4998,5008 **** + |location-list-file-window| for more + details. + +! getmatches() *getmatches()* +! Returns a |List| with all matches previously defined by +! |matchadd()| and the |:match| commands. |getmatches()| is +! useful in combination with |setmatches()|, as |setmatches()| +! can restore a list of matches saved by |getmatches()|. + Example: > + :echo getmatches() + < [{'group': 'MyGroup1', 'pattern': 'TODO', +--- 5038,5049 ---- + |location-list-file-window| for more + details. + +! getmatches([{win}]) *getmatches()* +! Returns a |List| with all matches previously defined for the +! current window by |matchadd()| and the |:match| commands. +! |getmatches()| is useful in combination with |setmatches()|, +! as |setmatches()| can restore a list of matches saved by +! |getmatches()|. + Example: > + :echo getmatches() + < [{'group': 'MyGroup1', 'pattern': 'TODO', +*************** +*** 6303,6313 **** +--- 6349,6362 ---- + When {expr} is a |List| then this returns the index of the + first item where {pat} matches. Each item is used as a + String, |Lists| and |Dictionaries| are used as echoed. ++ + Otherwise, {expr} is used as a String. The result is a + Number, which gives the index (byte offset) in {expr} where + {pat} matches. ++ + A match at the first character or |List| item returns zero. + If there is no match -1 is returned. ++ + For getting submatches see |matchlist()|. + Example: > + :echo match("testing", "ing") " results in 4 +*************** +*** 6359,6365 **** + Defines a pattern to be highlighted in the current window (a + "match"). It will be highlighted with {group}. Returns an + identification number (ID), which can be used to delete the +! match using |matchdelete()|. + Matching is case sensitive and magic, unless case sensitivity + or magicness are explicitly overridden in {pattern}. The + 'magic', 'smartcase' and 'ignorecase' options are not used. +--- 6408,6414 ---- + Defines a pattern to be highlighted in the current window (a + "match"). It will be highlighted with {group}. Returns an + identification number (ID), which can be used to delete the +! match using |matchdelete()|. The ID is bound to the window. + Matching is case sensitive and magic, unless case sensitivity + or magicness are explicitly overridden in {pattern}. The + 'magic', 'smartcase' and 'ignorecase' options are not used. +*************** +*** 6455,6465 **** + Highlighting matches using the |:match| commands are limited + to three matches. |matchadd()| does not have this limitation. + +! matchdelete({id}) *matchdelete()* *E802* *E803* + Deletes a match with ID {id} previously defined by |matchadd()| + or one of the |:match| commands. Returns 0 if successful, + otherwise -1. See example for |matchadd()|. All matches can + be deleted in one operation by |clearmatches()|. + + matchend({expr}, {pat} [, {start} [, {count}]]) *matchend()* + Same as |match()|, but return the index of first character +--- 6504,6516 ---- + Highlighting matches using the |:match| commands are limited + to three matches. |matchadd()| does not have this limitation. + +! matchdelete({id} [, {win}) *matchdelete()* *E802* *E803* + Deletes a match with ID {id} previously defined by |matchadd()| + or one of the |:match| commands. Returns 0 if successful, + otherwise -1. See example for |matchadd()|. All matches can + be deleted in one operation by |clearmatches()|. ++ If {win} is specified, use the window with this number or ++ window ID instead of the current window. + + matchend({expr}, {pat} [, {start} [, {count}]]) *matchend()* + Same as |match()|, but return the index of first character +*************** +*** 7852,7861 **** + only the items listed in {what} are set. Refer to |setqflist()| + for the list of supported keys in {what}. + +! setmatches({list}) *setmatches()* +! Restores a list of matches saved by |getmatches()|. Returns 0 +! if successful, otherwise -1. All current matches are cleared +! before the list is restored. See example for |getmatches()|. + + *setpos()* + setpos({expr}, {list}) +--- 7921,7933 ---- + only the items listed in {what} are set. Refer to |setqflist()| + for the list of supported keys in {what}. + +! setmatches({list} [, {win}]) *setmatches()* +! Restores a list of matches saved by |getmatches() for the +! current window|. Returns 0 if successful, otherwise -1. All +! current matches are cleared before the list is restored. See +! example for |getmatches()|. +! If {win} is specified, use the window with this number or +! window ID instead of the current window. + + *setpos()* + setpos({expr}, {list}) +*** ../vim-8.1.1083/src/evalfunc.c 2019-03-30 14:26:15.268619122 +0100 +--- src/evalfunc.c 2019-03-30 18:04:15.531433052 +0100 +*************** +*** 31,36 **** +--- 31,37 ---- + static char *e_listarg = N_("E686: Argument of %s must be a List"); + static char *e_listblobarg = N_("E899: Argument of %s must be a List or Blob"); + static char *e_stringreq = N_("E928: String required"); ++ static char *e_invalwindow = N_("E957: Invalid window number"); + + #ifdef FEAT_FLOAT + static void f_abs(typval_T *argvars, typval_T *rettv); +*************** +*** 590,596 **** + {"changenr", 0, 0, f_changenr}, + {"char2nr", 1, 2, f_char2nr}, + {"cindent", 1, 1, f_cindent}, +! {"clearmatches", 0, 0, f_clearmatches}, + {"col", 1, 1, f_col}, + #if defined(FEAT_INS_EXPAND) + {"complete", 2, 2, f_complete}, +--- 591,597 ---- + {"changenr", 0, 0, f_changenr}, + {"char2nr", 1, 2, f_char2nr}, + {"cindent", 1, 1, f_cindent}, +! {"clearmatches", 0, 1, f_clearmatches}, + {"col", 1, 1, f_col}, + #if defined(FEAT_INS_EXPAND) + {"complete", 2, 2, f_complete}, +*************** +*** 677,683 **** + {"getjumplist", 0, 2, f_getjumplist}, + {"getline", 1, 2, f_getline}, + {"getloclist", 1, 2, f_getloclist}, +! {"getmatches", 0, 0, f_getmatches}, + {"getpid", 0, 0, f_getpid}, + {"getpos", 1, 1, f_getpos}, + {"getqflist", 0, 1, f_getqflist}, +--- 678,684 ---- + {"getjumplist", 0, 2, f_getjumplist}, + {"getline", 1, 2, f_getline}, + {"getloclist", 1, 2, f_getloclist}, +! {"getmatches", 0, 1, f_getmatches}, + {"getpid", 0, 0, f_getpid}, + {"getpos", 1, 1, f_getpos}, + {"getqflist", 0, 1, f_getqflist}, +*************** +*** 761,767 **** + {"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}, + {"matchlist", 2, 4, f_matchlist}, + {"matchstr", 2, 4, f_matchstr}, +--- 762,768 ---- + {"matchadd", 2, 5, f_matchadd}, + {"matchaddpos", 2, 5, f_matchaddpos}, + {"matcharg", 1, 1, f_matcharg}, +! {"matchdelete", 1, 2, f_matchdelete}, + {"matchend", 2, 4, f_matchend}, + {"matchlist", 2, 4, f_matchlist}, + {"matchstr", 2, 4, f_matchstr}, +*************** +*** 859,865 **** + {"setfperm", 2, 2, f_setfperm}, + {"setline", 2, 2, f_setline}, + {"setloclist", 2, 4, f_setloclist}, +! {"setmatches", 1, 1, f_setmatches}, + {"setpos", 2, 2, f_setpos}, + {"setqflist", 1, 3, f_setqflist}, + {"setreg", 2, 3, f_setreg}, +--- 860,866 ---- + {"setfperm", 2, 2, f_setfperm}, + {"setline", 2, 2, f_setline}, + {"setloclist", 2, 4, f_setloclist}, +! {"setmatches", 1, 2, f_setmatches}, + {"setpos", 2, 2, f_setpos}, + {"setqflist", 1, 3, f_setqflist}, + {"setreg", 2, 3, f_setreg}, +*************** +*** 2496,2501 **** +--- 2497,2519 ---- + rettv->vval.v_number = -1; + } + ++ static win_T * ++ get_optional_window(typval_T *argvars, int idx) ++ { ++ win_T *win = curwin; ++ ++ if (argvars[idx].v_type != VAR_UNKNOWN) ++ { ++ win = find_win_by_nr_or_id(&argvars[idx]); ++ if (win == NULL) ++ { ++ emsg(_(e_invalwindow)); ++ return NULL; ++ } ++ } ++ return win; ++ } ++ + /* + * "clearmatches()" function + */ +*************** +*** 2503,2509 **** + f_clearmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED) + { + #ifdef FEAT_SEARCH_EXTRA +! clear_matches(curwin); + #endif + } + +--- 2521,2530 ---- + f_clearmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED) + { + #ifdef FEAT_SEARCH_EXTRA +! win_T *win = get_optional_window(argvars, 0); +! +! if (win != NULL) +! clear_matches(win); + #endif + } + +*************** +*** 5412,5471 **** + { + #ifdef FEAT_SEARCH_EXTRA + dict_T *dict; +! matchitem_T *cur = curwin->w_match_head; + int i; + +! if (rettv_list_alloc(rettv) == OK) + { +! while (cur != NULL) + { +! dict = dict_alloc(); +! if (dict == NULL) +! return; +! if (cur->match.regprog == NULL) + { +! /* match added with matchaddpos() */ +! for (i = 0; i < MAXPOSMATCH; ++i) +! { +! llpos_T *llpos; +! char buf[6]; +! list_T *l; + +! llpos = &cur->pos.pos[i]; +! if (llpos->lnum == 0) +! break; +! l = list_alloc(); +! if (l == NULL) +! break; +! list_append_number(l, (varnumber_T)llpos->lnum); +! if (llpos->col > 0) +! { +! list_append_number(l, (varnumber_T)llpos->col); +! list_append_number(l, (varnumber_T)llpos->len); +! } +! sprintf(buf, "pos%d", i + 1); +! dict_add_list(dict, buf, l); + } + } +! else +! { +! dict_add_string(dict, "pattern", cur->pattern); +! } +! dict_add_string(dict, "group", syn_id2name(cur->hlg_id)); +! dict_add_number(dict, "priority", (long)cur->priority); +! dict_add_number(dict, "id", (long)cur->id); + # if defined(FEAT_CONCEAL) +! if (cur->conceal_char) +! { +! char_u buf[MB_MAXBYTES + 1]; + +! buf[(*mb_char2bytes)((int)cur->conceal_char, buf)] = NUL; +! dict_add_string(dict, "conceal", (char_u *)&buf); +! } +! # endif +! list_append_dict(rettv->vval.v_list, dict); +! cur = cur->next; + } + } + #endif + } +--- 5433,5494 ---- + { + #ifdef FEAT_SEARCH_EXTRA + dict_T *dict; +! matchitem_T *cur; + int i; ++ win_T *win = get_optional_window(argvars, 0); + +! if (rettv_list_alloc(rettv) == FAIL || win == NULL) +! return; +! +! cur = win->w_match_head; +! while (cur != NULL) + { +! dict = dict_alloc(); +! if (dict == NULL) +! return; +! if (cur->match.regprog == NULL) + { +! /* match added with matchaddpos() */ +! for (i = 0; i < MAXPOSMATCH; ++i) + { +! llpos_T *llpos; +! char buf[6]; +! list_T *l; + +! llpos = &cur->pos.pos[i]; +! if (llpos->lnum == 0) +! break; +! l = list_alloc(); +! if (l == NULL) +! break; +! list_append_number(l, (varnumber_T)llpos->lnum); +! if (llpos->col > 0) +! { +! list_append_number(l, (varnumber_T)llpos->col); +! list_append_number(l, (varnumber_T)llpos->len); + } ++ sprintf(buf, "pos%d", i + 1); ++ dict_add_list(dict, buf, l); + } +! } +! else +! { +! dict_add_string(dict, "pattern", cur->pattern); +! } +! dict_add_string(dict, "group", syn_id2name(cur->hlg_id)); +! dict_add_number(dict, "priority", (long)cur->priority); +! dict_add_number(dict, "id", (long)cur->id); + # if defined(FEAT_CONCEAL) +! if (cur->conceal_char) +! { +! char_u buf[MB_MAXBYTES + 1]; + +! buf[(*mb_char2bytes)((int)cur->conceal_char, buf)] = NUL; +! dict_add_string(dict, "conceal", (char_u *)&buf); + } ++ # endif ++ list_append_dict(rettv->vval.v_list, dict); ++ cur = cur->next; + } + #endif + } +*************** +*** 8245,8251 **** + *win = find_win_by_nr_or_id(&di->di_tv); + if (*win == NULL) + { +! emsg(_("E957: Invalid window number")); + return FAIL; + } + } +--- 8268,8274 ---- + *win = find_win_by_nr_or_id(&di->di_tv); + if (*win == NULL) + { +! emsg(_(e_invalwindow)); + return FAIL; + } + } +*************** +*** 8393,8399 **** + f_matchdelete(typval_T *argvars UNUSED, typval_T *rettv UNUSED) + { + #ifdef FEAT_SEARCH_EXTRA +! rettv->vval.v_number = match_delete(curwin, + (int)tv_get_number(&argvars[0]), TRUE); + #endif + } +--- 8416,8427 ---- + f_matchdelete(typval_T *argvars UNUSED, typval_T *rettv UNUSED) + { + #ifdef FEAT_SEARCH_EXTRA +! win_T *win = get_optional_window(argvars, 1); +! +! if (win == NULL) +! rettv->vval.v_number = -1; +! else +! rettv->vval.v_number = match_delete(win, + (int)tv_get_number(&argvars[0]), TRUE); + #endif + } +*************** +*** 11206,11211 **** +--- 11234,11240 ---- + listitem_T *li; + dict_T *d; + list_T *s = NULL; ++ win_T *win = get_optional_window(argvars, 1); + + rettv->vval.v_number = -1; + if (argvars[0].v_type != VAR_LIST) +*************** +*** 11213,11221 **** + emsg(_(e_listreq)); + return; + } + if ((l = argvars[0].vval.v_list) != NULL) + { +- + /* To some extent make sure that we are dealing with a list from + * "getmatches()". */ + li = l->lv_first; +--- 11242,11252 ---- + emsg(_(e_listreq)); + return; + } ++ if (win == NULL) ++ return; ++ + if ((l = argvars[0].vval.v_list) != NULL) + { + /* To some extent make sure that we are dealing with a list from + * "getmatches()". */ + li = l->lv_first; +*************** +*** 11239,11245 **** + li = li->li_next; + } + +! clear_matches(curwin); + li = l->lv_first; + while (li != NULL) + { +--- 11270,11276 ---- + li = li->li_next; + } + +! clear_matches(win); + li = l->lv_first; + while (li != NULL) + { +*************** +*** 11286,11298 **** + : NULL; + if (i == 0) + { +! match_add(curwin, group, + dict_get_string(d, (char_u *)"pattern", FALSE), + priority, id, NULL, conceal); + } + else + { +! match_add(curwin, group, NULL, priority, id, s, conceal); + list_unref(s); + s = NULL; + } +--- 11317,11329 ---- + : NULL; + if (i == 0) + { +! match_add(win, group, + dict_get_string(d, (char_u *)"pattern", FALSE), + priority, id, NULL, conceal); + } + else + { +! match_add(win, group, NULL, priority, id, s, conceal); + list_unref(s); + s = NULL; + } +*** ../vim-8.1.1083/src/testdir/test_match.vim 2019-01-24 17:59:35.139217458 +0100 +--- src/testdir/test_match.vim 2019-03-30 17:48:06.817387861 +0100 +*************** +*** 205,210 **** +--- 205,223 ---- + call assert_equal(screenattr(1,2), screenattr(2,2)) + call assert_notequal(screenattr(1,2), screenattr(1,4)) + ++ let savematches = getmatches(winid) ++ let expect = [ ++ \ {'group': 'Search', 'pattern': '4', 'priority': 10, 'id': 4}, ++ \ {'group': 'Error', 'id': 5, 'priority': 10, 'pos1': [1, 2, 1], 'pos2': [2, 2, 1]}, ++ \] ++ call assert_equal(expect, savematches) ++ ++ call clearmatches(winid) ++ call assert_equal([], getmatches(winid)) ++ ++ call setmatches(savematches, winid) ++ call assert_equal(expect, savematches) ++ + wincmd w + bwipe! + call clearmatches() +*** ../vim-8.1.1083/src/version.c 2019-03-30 17:28:11.920987602 +0100 +--- src/version.c 2019-03-30 17:51:29.572116891 +0100 +*************** +*** 777,778 **** +--- 777,780 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1084, + /**/ + + +-- +hundred-and-one symptoms of being an internet addict: +162. You go outside and look for a brightness knob to turn down the sun. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |