mirror of
https://github.com/neovim/neovim.git
synced 2025-10-06 01:46:29 +00:00
vim-patch:8.1.1084: cannot delete a match from another window (#12325)
Problem: Cannot delete a match from another window. (Paul Jolly)
Solution: Add window ID argument to matchdelete(), clearmatches(),
getmatches() and setmatches(). (Andy Massimino, closes vim/vim#4178)
aff749145e
This commit is contained in:
@@ -63,6 +63,7 @@ static char *e_missbrac = N_("E111: Missing ']'");
|
||||
static char *e_dictrange = N_("E719: Cannot use [:] with a Dictionary");
|
||||
static char *e_illvar = N_("E461: Illegal variable name: %s");
|
||||
static char *e_cannot_mod = N_("E995: Cannot modify existing variable");
|
||||
static char *e_invalwindow = N_("E957: Invalid window number");
|
||||
|
||||
// TODO(ZyX-I): move to eval/executor
|
||||
static char *e_letwrong = N_("E734: Wrong variable type for %s=");
|
||||
@@ -6776,7 +6777,7 @@ int matchadd_dict_arg(typval_T *tv, const char **conceal_char,
|
||||
if ((di = tv_dict_find(tv->vval.v_dict, S_LEN("window"))) != NULL) {
|
||||
*win = find_win_by_nr_or_id(&di->di_tv);
|
||||
if (*win == NULL) {
|
||||
EMSG(_("E957: Invalid window number"));
|
||||
EMSG(_(e_invalwindow));
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
@@ -64,7 +64,7 @@ return {
|
||||
chansend={args=2},
|
||||
char2nr={args={1, 2}},
|
||||
cindent={args=1},
|
||||
clearmatches={},
|
||||
clearmatches={args={0, 1}},
|
||||
col={args=1},
|
||||
complete={args=2},
|
||||
complete_add={args=1},
|
||||
@@ -149,7 +149,7 @@ return {
|
||||
getjumplist={args={0, 2}},
|
||||
getline={args={1, 2}},
|
||||
getloclist={args={1, 2}},
|
||||
getmatches={},
|
||||
getmatches={args={0, 1}},
|
||||
getpid={},
|
||||
getpos={args=1},
|
||||
getqflist={args={0, 1}},
|
||||
@@ -227,7 +227,7 @@ return {
|
||||
matchadd={args={2, 5}},
|
||||
matchaddpos={args={2, 5}},
|
||||
matcharg={args=1},
|
||||
matchdelete={args=1},
|
||||
matchdelete={args={1, 2}},
|
||||
matchend={args={2, 4}},
|
||||
matchlist={args={2, 4}},
|
||||
matchstr={args={2, 4}},
|
||||
@@ -293,7 +293,7 @@ return {
|
||||
setfperm={args=2},
|
||||
setline={args=2},
|
||||
setloclist={args={2, 4}},
|
||||
setmatches={args=1},
|
||||
setmatches={args={1, 2}},
|
||||
setpos={args=2},
|
||||
setqflist={args={1, 3}},
|
||||
setreg={args={2, 3}},
|
||||
|
@@ -93,6 +93,7 @@ PRAGMA_DIAG_POP
|
||||
|
||||
static char *e_listarg = N_("E686: Argument of %s must be a List");
|
||||
static char *e_stringreq = N_("E928: String required");
|
||||
static char *e_invalwindow = N_("E957: Invalid window number");
|
||||
|
||||
/// Dummy va_list for passing to vim_snprintf
|
||||
///
|
||||
@@ -952,12 +953,30 @@ static void f_cindent(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
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
|
||||
*/
|
||||
static void f_clearmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
clear_matches(curwin);
|
||||
win_T *win = get_optional_window(argvars, 0);
|
||||
|
||||
if (win != NULL) {
|
||||
clear_matches(win);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3452,10 +3471,16 @@ static void f_getloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
*/
|
||||
static void f_getmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
matchitem_T *cur = curwin->w_match_head;
|
||||
matchitem_T *cur;
|
||||
int i;
|
||||
win_T *win = get_optional_window(argvars, 0);
|
||||
|
||||
if (win == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
tv_list_alloc_ret(rettv, kListLenMayKnow);
|
||||
cur = win->w_match_head;
|
||||
while (cur != NULL) {
|
||||
dict_T *dict = tv_dict_alloc();
|
||||
if (cur->match.regprog == NULL) {
|
||||
@@ -5771,8 +5796,13 @@ static void f_matcharg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
*/
|
||||
static void f_matchdelete(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
rettv->vval.v_number = match_delete(curwin,
|
||||
(int)tv_get_number(&argvars[0]), true);
|
||||
win_T *win = get_optional_window(argvars, 1);
|
||||
if (win == NULL) {
|
||||
rettv->vval.v_number = -1;
|
||||
} else {
|
||||
rettv->vval.v_number = match_delete(curwin,
|
||||
(int)tv_get_number(&argvars[0]), true);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -8136,14 +8166,19 @@ static void f_setloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
*/
|
||||
static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
dict_T *d;
|
||||
list_T *s = NULL;
|
||||
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) {
|
||||
EMSG(_(e_listreq));
|
||||
return;
|
||||
}
|
||||
if (win == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
list_T *const l = argvars[0].vval.v_list;
|
||||
// To some extent make sure that we are dealing with a list from
|
||||
// "getmatches()".
|
||||
@@ -8167,7 +8202,7 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
li_idx++;
|
||||
});
|
||||
|
||||
clear_matches(curwin);
|
||||
clear_matches(win);
|
||||
bool match_add_failed = false;
|
||||
TV_LIST_ITER_CONST(l, li, {
|
||||
int i = 0;
|
||||
@@ -8213,13 +8248,13 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
? tv_get_string(&conceal_di->di_tv)
|
||||
: NULL);
|
||||
if (i == 0) {
|
||||
if (match_add(curwin, group,
|
||||
if (match_add(win, group,
|
||||
tv_dict_get_string(d, "pattern", false),
|
||||
priority, id, NULL, conceal) != id) {
|
||||
match_add_failed = true;
|
||||
}
|
||||
} else {
|
||||
if (match_add(curwin, group, NULL, priority, id, s, conceal) != id) {
|
||||
if (match_add(win, group, NULL, priority, id, s, conceal) != id) {
|
||||
match_add_failed = true;
|
||||
}
|
||||
tv_list_unref(s);
|
||||
|
@@ -217,6 +217,19 @@ func Test_matchaddpos_otherwin()
|
||||
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()
|
||||
|
Reference in New Issue
Block a user