Skip to content

Commit

Permalink
patch 8.2.0357: cannot delete a text property matching both id and type
Browse files Browse the repository at this point in the history
Problem:    Cannot delete a text property matching both id and type. (Axel
            Forsman)
Solution:   Add the "both" argument.
  • Loading branch information
brammool committed Mar 5, 2020
1 parent 8f027fe commit 49b79bd
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 1 deletion.
1 change: 1 addition & 0 deletions runtime/doc/textprop.txt
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ prop_remove({props} [, {lnum} [, {lnum-end}]])
{props} is a dictionary with these fields:
id remove text properties with this ID
type remove text properties with this type name
both "id" and "type" must both match
bufnr use this buffer instead of the current one
all when TRUE remove all matching text properties,
not just the first one
Expand Down
17 changes: 17 additions & 0 deletions src/testdir/test_textprop.vim
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,23 @@ func Test_prop_remove()

call DeletePropTypes()
bwipe!

new
call AddPropTypes()
call SetupPropsInFirstLine()
call prop_add(1, 6, {'length': 2, 'id': 11, 'type': 'three'})
let props = Get_expected_props()
call insert(props, {'col': 6, 'length': 2, 'id': 11, 'type': 'three', 'start': 1, 'end': 1}, 3)
call assert_equal(props, prop_list(1))
call assert_equal(1, prop_remove({'type': 'three', 'id': 11, 'both': 1, 'all': 1}, 1))
unlet props[3]
call assert_equal(props, prop_list(1))

call assert_fails("call prop_remove({'id': 11, 'both': 1})", 'E860')
call assert_fails("call prop_remove({'type': 'three', 'both': 1})", 'E860')

call DeletePropTypes()
bwipe!
endfunc

func SetupOneLine()
Expand Down
11 changes: 10 additions & 1 deletion src/textprop.c
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,7 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
int do_all = FALSE;
int id = -1;
int type_id = -1;
int both = FALSE;

rettv->vval.v_number = 0;
if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL)
Expand Down Expand Up @@ -838,11 +839,18 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
return;
type_id = type->pt_id;
}
if (dict_find(dict, (char_u *)"both", -1) != NULL)
both = dict_get_number(dict, (char_u *)"both");
if (id == -1 && type_id == -1)
{
emsg(_("E968: Need at least one of 'id' or 'type'"));
return;
}
if (both && (id == -1 || type_id == -1))
{
emsg(_("E860: Need 'id' and 'type' with 'both'"));
return;
}

if (end == 0)
end = buf->b_ml.ml_line_count;
Expand All @@ -868,7 +876,8 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
size_t taillen;

mch_memmove(&textprop, cur_prop, sizeof(textprop_T));
if (textprop.tp_id == id || textprop.tp_type == type_id)
if (both ? textprop.tp_id == id && textprop.tp_type == type_id
: textprop.tp_id == id || textprop.tp_type == type_id)
{
if (!(buf->b_ml.ml_flags & ML_LINE_DIRTY))
{
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
357,
/**/
356,
/**/
Expand Down

0 comments on commit 49b79bd

Please sign in to comment.