0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.0357: cannot delete a text property matching both id and type

Problem:    Cannot delete a text property matching both id and type. (Axel
            Forsman)
Solution:   Add the "both" argument.
This commit is contained in:
Bram Moolenaar
2020-03-05 21:52:55 +01:00
parent 8f027fe470
commit 49b79bd488
4 changed files with 30 additions and 1 deletions

View File

@@ -231,6 +231,7 @@ prop_remove({props} [, {lnum} [, {lnum-end}]])
{props} is a dictionary with these fields: {props} is a dictionary with these fields:
id remove text properties with this ID id remove text properties with this ID
type remove text properties with this type name type remove text properties with this type name
both "id" and "type" must both match
bufnr use this buffer instead of the current one bufnr use this buffer instead of the current one
all when TRUE remove all matching text properties, all when TRUE remove all matching text properties,
not just the first one not just the first one

View File

@@ -270,6 +270,23 @@ func Test_prop_remove()
call DeletePropTypes() call DeletePropTypes()
bwipe! 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 endfunc
func SetupOneLine() func SetupOneLine()

View File

@@ -796,6 +796,7 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
int do_all = FALSE; int do_all = FALSE;
int id = -1; int id = -1;
int type_id = -1; int type_id = -1;
int both = FALSE;
rettv->vval.v_number = 0; rettv->vval.v_number = 0;
if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL) if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL)
@@ -838,11 +839,18 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
return; return;
type_id = type->pt_id; 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) if (id == -1 && type_id == -1)
{ {
emsg(_("E968: Need at least one of 'id' or 'type'")); emsg(_("E968: Need at least one of 'id' or 'type'"));
return; return;
} }
if (both && (id == -1 || type_id == -1))
{
emsg(_("E860: Need 'id' and 'type' with 'both'"));
return;
}
if (end == 0) if (end == 0)
end = buf->b_ml.ml_line_count; end = buf->b_ml.ml_line_count;
@@ -868,7 +876,8 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
size_t taillen; size_t taillen;
mch_memmove(&textprop, cur_prop, sizeof(textprop_T)); 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)) if (!(buf->b_ml.ml_flags & ML_LINE_DIRTY))
{ {

View File

@@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
357,
/**/ /**/
356, 356,
/**/ /**/