forked from aniani/vim
patch 8.2.2667: prop_find() cannot find item matching both id and type
Problem: prop_find() cannot find item matching both id and type. Solution: Add the "both" argument. (Naohiro Ono, closes #8019)
This commit is contained in:
parent
c580943965
commit
24f21fdfca
@ -175,6 +175,7 @@ prop_find({props} [, {direction}])
|
|||||||
Search for a text property as specified with {props}:
|
Search for a text property as specified with {props}:
|
||||||
id property with this ID
|
id property with this ID
|
||||||
type property with this type name
|
type property with this type name
|
||||||
|
both "id" and "type" must both match
|
||||||
bufnr buffer to search in; when present a
|
bufnr buffer to search in; when present a
|
||||||
start position with "lnum" and "col"
|
start position with "lnum" and "col"
|
||||||
must be given; when omitted the
|
must be given; when omitted the
|
||||||
@ -187,6 +188,7 @@ prop_find({props} [, {direction}])
|
|||||||
skipstart do not look for a match at the start
|
skipstart do not look for a match at the start
|
||||||
position
|
position
|
||||||
|
|
||||||
|
A property matches when either "id" or "type" matches.
|
||||||
{direction} can be "f" for forward and "b" for backward. When
|
{direction} can be "f" for forward and "b" for backward. When
|
||||||
omitted forward search is performed.
|
omitted forward search is performed.
|
||||||
|
|
||||||
|
@ -245,6 +245,25 @@ func Test_prop_find_smaller_len_than_match_col()
|
|||||||
call prop_type_delete('test')
|
call prop_type_delete('test')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_prop_find_with_both_option_enabled()
|
||||||
|
" Initialize
|
||||||
|
new
|
||||||
|
call AddPropTypes()
|
||||||
|
call SetupPropsInFirstLine()
|
||||||
|
let props = Get_expected_props()->map({_, v -> extend(v, {'lnum': 1})})
|
||||||
|
" Test
|
||||||
|
call assert_fails("call prop_find({'both': 1})", 'E968:')
|
||||||
|
call assert_fails("call prop_find({'id': 11, 'both': 1})", 'E860:')
|
||||||
|
call assert_fails("call prop_find({'type': 'three', 'both': 1})", 'E860:')
|
||||||
|
call assert_equal({}, prop_find({'id': 11, 'type': 'three', 'both': 1}))
|
||||||
|
call assert_equal({}, prop_find({'id': 130000, 'type': 'one', 'both': 1}))
|
||||||
|
call assert_equal(props[2], prop_find({'id': 12, 'type': 'two', 'both': 1}))
|
||||||
|
call assert_equal(props[0], prop_find({'id': 14, 'type': 'whole', 'both': 1}))
|
||||||
|
" Clean up
|
||||||
|
call DeletePropTypes()
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_prop_add()
|
func Test_prop_add()
|
||||||
new
|
new
|
||||||
call AddPropTypes()
|
call AddPropTypes()
|
||||||
|
@ -600,6 +600,7 @@ f_prop_find(typval_T *argvars, typval_T *rettv)
|
|||||||
int lnum = -1;
|
int lnum = -1;
|
||||||
int col = -1;
|
int col = -1;
|
||||||
int dir = 1; // 1 = forward, -1 = backward
|
int dir = 1; // 1 = forward, -1 = backward
|
||||||
|
int both;
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
@ -661,11 +662,17 @@ f_prop_find(typval_T *argvars, typval_T *rettv)
|
|||||||
return;
|
return;
|
||||||
type_id = type->pt_id;
|
type_id = type->pt_id;
|
||||||
}
|
}
|
||||||
|
both = dict_get_bool(dict, (char_u *)"both", FALSE);
|
||||||
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;
|
||||||
|
}
|
||||||
|
|
||||||
lnum_start = lnum;
|
lnum_start = lnum;
|
||||||
|
|
||||||
@ -698,7 +705,8 @@ f_prop_find(typval_T *argvars, typval_T *rettv)
|
|||||||
else if (prop.tp_col + prop.tp_len - (prop.tp_len != 0) < col)
|
else if (prop.tp_col + prop.tp_len - (prop.tp_len != 0) < col)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (prop.tp_id == id || prop.tp_type == type_id)
|
if (both ? prop.tp_id == id && prop.tp_type == type_id
|
||||||
|
: prop.tp_id == id || prop.tp_type == type_id)
|
||||||
{
|
{
|
||||||
// Check if the starting position has text props.
|
// Check if the starting position has text props.
|
||||||
if (lnum_start == lnum
|
if (lnum_start == lnum
|
||||||
|
@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
2667,
|
||||||
/**/
|
/**/
|
||||||
2666,
|
2666,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user