mirror of
https://github.com/vim/vim
synced 2025-03-26 11:45:22 +01:00
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
4 changed files with 32 additions and 1 deletions
|
@ -175,6 +175,7 @@ prop_find({props} [, {direction}])
|
|||
Search for a text property as specified with {props}:
|
||||
id property with this ID
|
||||
type property with this type name
|
||||
both "id" and "type" must both match
|
||||
bufnr buffer to search in; when present a
|
||||
start position with "lnum" and "col"
|
||||
must be given; when omitted the
|
||||
|
@ -187,6 +188,7 @@ prop_find({props} [, {direction}])
|
|||
skipstart do not look for a match at the start
|
||||
position
|
||||
|
||||
A property matches when either "id" or "type" matches.
|
||||
{direction} can be "f" for forward and "b" for backward. When
|
||||
omitted forward search is performed.
|
||||
|
||||
|
|
|
@ -245,6 +245,25 @@ func Test_prop_find_smaller_len_than_match_col()
|
|||
call prop_type_delete('test')
|
||||
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()
|
||||
new
|
||||
call AddPropTypes()
|
||||
|
|
|
@ -600,6 +600,7 @@ f_prop_find(typval_T *argvars, typval_T *rettv)
|
|||
int lnum = -1;
|
||||
int col = -1;
|
||||
int dir = 1; // 1 = forward, -1 = backward
|
||||
int both;
|
||||
|
||||
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;
|
||||
type_id = type->pt_id;
|
||||
}
|
||||
both = dict_get_bool(dict, (char_u *)"both", FALSE);
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
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.
|
||||
if (lnum_start == lnum
|
||||
|
|
|
@ -750,6 +750,8 @@ static char *(features[]) =
|
|||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
2667,
|
||||
/**/
|
||||
2666,
|
||||
/**/
|
||||
|
|
Loading…
Add table
Reference in a new issue