Skip to content

Commit c2af0af

Browse files
committed
patch 8.2.1519: Vim9: Ex command default range is not set
Problem: Vim9: Ex command default range is not set. Solution: When range is not given use default. (closes #6779)
1 parent 2e80095 commit c2af0af

3 files changed

Lines changed: 138 additions & 98 deletions

File tree

src/ex_docmd.c

Lines changed: 124 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ static int getargopt(exarg_T *eap);
6666
# define ex_cexpr ex_ni
6767
#endif
6868

69+
static linenr_T default_address(exarg_T *eap);
6970
static linenr_T get_address(exarg_T *, char_u **, cmd_addr_T addr_type, int skip, int silent, int to_other_file, int address_count);
71+
static void address_default_all(exarg_T *eap);
7072
static void get_flags(exarg_T *eap);
7173
#if !defined(FEAT_PERL) \
7274
|| !defined(FEAT_PYTHON) || !defined(FEAT_PYTHON3) \
@@ -1880,7 +1882,9 @@ do_one_cmd(
18801882

18811883
ea.cmd = cmd;
18821884
#ifdef FEAT_EVAL
1883-
if (may_have_range)
1885+
if (!may_have_range)
1886+
ea.line1 = ea.line2 = default_address(&ea);
1887+
else
18841888
#endif
18851889
if (parse_cmd_address(&ea, &errormsg, FALSE) == FAIL)
18861890
goto doend;
@@ -2282,59 +2286,7 @@ do_one_cmd(
22822286
}
22832287

22842288
if ((ea.argt & EX_DFLALL) && ea.addr_count == 0)
2285-
{
2286-
buf_T *buf;
2287-
2288-
ea.line1 = 1;
2289-
switch (ea.addr_type)
2290-
{
2291-
case ADDR_LINES:
2292-
case ADDR_OTHER:
2293-
ea.line2 = curbuf->b_ml.ml_line_count;
2294-
break;
2295-
case ADDR_LOADED_BUFFERS:
2296-
buf = firstbuf;
2297-
while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL)
2298-
buf = buf->b_next;
2299-
ea.line1 = buf->b_fnum;
2300-
buf = lastbuf;
2301-
while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL)
2302-
buf = buf->b_prev;
2303-
ea.line2 = buf->b_fnum;
2304-
break;
2305-
case ADDR_BUFFERS:
2306-
ea.line1 = firstbuf->b_fnum;
2307-
ea.line2 = lastbuf->b_fnum;
2308-
break;
2309-
case ADDR_WINDOWS:
2310-
ea.line2 = LAST_WIN_NR;
2311-
break;
2312-
case ADDR_TABS:
2313-
ea.line2 = LAST_TAB_NR;
2314-
break;
2315-
case ADDR_TABS_RELATIVE:
2316-
ea.line2 = 1;
2317-
break;
2318-
case ADDR_ARGUMENTS:
2319-
if (ARGCOUNT == 0)
2320-
ea.line1 = ea.line2 = 0;
2321-
else
2322-
ea.line2 = ARGCOUNT;
2323-
break;
2324-
case ADDR_QUICKFIX_VALID:
2325-
#ifdef FEAT_QUICKFIX
2326-
ea.line2 = qf_get_valid_size(&ea);
2327-
if (ea.line2 == 0)
2328-
ea.line2 = 1;
2329-
#endif
2330-
break;
2331-
case ADDR_NONE:
2332-
case ADDR_UNSIGNED:
2333-
case ADDR_QUICKFIX:
2334-
iemsg(_("INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX"));
2335-
break;
2336-
}
2337-
}
2289+
address_default_all(&ea);
23382290

23392291
// accept numbered register only when no count allowed (:put)
23402292
if ( (ea.argt & EX_REGSTR)
@@ -3011,50 +2963,7 @@ parse_cmd_address(exarg_T *eap, char **errormsg, int silent)
30112963
for (;;)
30122964
{
30132965
eap->line1 = eap->line2;
3014-
switch (eap->addr_type)
3015-
{
3016-
case ADDR_LINES:
3017-
case ADDR_OTHER:
3018-
// Default is the cursor line number. Avoid using an invalid
3019-
// line number though.
3020-
if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
3021-
eap->line2 = curbuf->b_ml.ml_line_count;
3022-
else
3023-
eap->line2 = curwin->w_cursor.lnum;
3024-
break;
3025-
case ADDR_WINDOWS:
3026-
eap->line2 = CURRENT_WIN_NR;
3027-
break;
3028-
case ADDR_ARGUMENTS:
3029-
eap->line2 = curwin->w_arg_idx + 1;
3030-
if (eap->line2 > ARGCOUNT)
3031-
eap->line2 = ARGCOUNT;
3032-
break;
3033-
case ADDR_LOADED_BUFFERS:
3034-
case ADDR_BUFFERS:
3035-
eap->line2 = curbuf->b_fnum;
3036-
break;
3037-
case ADDR_TABS:
3038-
eap->line2 = CURRENT_TAB_NR;
3039-
break;
3040-
case ADDR_TABS_RELATIVE:
3041-
case ADDR_UNSIGNED:
3042-
eap->line2 = 1;
3043-
break;
3044-
case ADDR_QUICKFIX:
3045-
#ifdef FEAT_QUICKFIX
3046-
eap->line2 = qf_get_cur_idx(eap);
3047-
#endif
3048-
break;
3049-
case ADDR_QUICKFIX_VALID:
3050-
#ifdef FEAT_QUICKFIX
3051-
eap->line2 = qf_get_cur_valid_idx(eap);
3052-
#endif
3053-
break;
3054-
case ADDR_NONE:
3055-
// Will give an error later if a range is found.
3056-
break;
3057-
}
2966+
eap->line2 = default_address(eap);
30582967
eap->cmd = skipwhite(eap->cmd);
30592968
lnum = get_address(eap, &eap->cmd, eap->addr_type, eap->skip, silent,
30602969
eap->addr_count == 0, address_count++);
@@ -3672,6 +3581,61 @@ addr_error(cmd_addr_T addr_type)
36723581
emsg(_(e_invrange));
36733582
}
36743583

3584+
/*
3585+
* Return the default address for an address type.
3586+
*/
3587+
static linenr_T
3588+
default_address(exarg_T *eap)
3589+
{
3590+
linenr_T lnum = 0;
3591+
3592+
switch (eap->addr_type)
3593+
{
3594+
case ADDR_LINES:
3595+
case ADDR_OTHER:
3596+
// Default is the cursor line number. Avoid using an invalid
3597+
// line number though.
3598+
if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
3599+
lnum = curbuf->b_ml.ml_line_count;
3600+
else
3601+
lnum = curwin->w_cursor.lnum;
3602+
break;
3603+
case ADDR_WINDOWS:
3604+
lnum = CURRENT_WIN_NR;
3605+
break;
3606+
case ADDR_ARGUMENTS:
3607+
lnum = curwin->w_arg_idx + 1;
3608+
if (lnum > ARGCOUNT)
3609+
lnum = ARGCOUNT;
3610+
break;
3611+
case ADDR_LOADED_BUFFERS:
3612+
case ADDR_BUFFERS:
3613+
lnum = curbuf->b_fnum;
3614+
break;
3615+
case ADDR_TABS:
3616+
lnum = CURRENT_TAB_NR;
3617+
break;
3618+
case ADDR_TABS_RELATIVE:
3619+
case ADDR_UNSIGNED:
3620+
lnum = 1;
3621+
break;
3622+
case ADDR_QUICKFIX:
3623+
#ifdef FEAT_QUICKFIX
3624+
lnum = qf_get_cur_idx(eap);
3625+
#endif
3626+
break;
3627+
case ADDR_QUICKFIX_VALID:
3628+
#ifdef FEAT_QUICKFIX
3629+
lnum = qf_get_cur_valid_idx(eap);
3630+
#endif
3631+
break;
3632+
case ADDR_NONE:
3633+
// Will give an error later if a range is found.
3634+
break;
3635+
}
3636+
return lnum;
3637+
}
3638+
36753639
/*
36763640
* Get a single EX address.
36773641
*
@@ -4033,6 +3997,68 @@ get_address(
40333997
return lnum;
40343998
}
40353999

4000+
/*
4001+
* Set eap->line1 and eap->line2 to the whole range.
4002+
* Used for commands with the EX_DFLALL flag and no range given.
4003+
*/
4004+
static void
4005+
address_default_all(exarg_T *eap)
4006+
{
4007+
eap->line1 = 1;
4008+
switch (eap->addr_type)
4009+
{
4010+
case ADDR_LINES:
4011+
case ADDR_OTHER:
4012+
eap->line2 = curbuf->b_ml.ml_line_count;
4013+
break;
4014+
case ADDR_LOADED_BUFFERS:
4015+
{
4016+
buf_T *buf = firstbuf;
4017+
4018+
while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL)
4019+
buf = buf->b_next;
4020+
eap->line1 = buf->b_fnum;
4021+
buf = lastbuf;
4022+
while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL)
4023+
buf = buf->b_prev;
4024+
eap->line2 = buf->b_fnum;
4025+
}
4026+
break;
4027+
case ADDR_BUFFERS:
4028+
eap->line1 = firstbuf->b_fnum;
4029+
eap->line2 = lastbuf->b_fnum;
4030+
break;
4031+
case ADDR_WINDOWS:
4032+
eap->line2 = LAST_WIN_NR;
4033+
break;
4034+
case ADDR_TABS:
4035+
eap->line2 = LAST_TAB_NR;
4036+
break;
4037+
case ADDR_TABS_RELATIVE:
4038+
eap->line2 = 1;
4039+
break;
4040+
case ADDR_ARGUMENTS:
4041+
if (ARGCOUNT == 0)
4042+
eap->line1 = eap->line2 = 0;
4043+
else
4044+
eap->line2 = ARGCOUNT;
4045+
break;
4046+
case ADDR_QUICKFIX_VALID:
4047+
#ifdef FEAT_QUICKFIX
4048+
eap->line2 = qf_get_valid_size(eap);
4049+
if (eap->line2 == 0)
4050+
eap->line2 = 1;
4051+
#endif
4052+
break;
4053+
case ADDR_NONE:
4054+
case ADDR_UNSIGNED:
4055+
case ADDR_QUICKFIX:
4056+
iemsg(_("INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX"));
4057+
break;
4058+
}
4059+
}
4060+
4061+
40364062
/*
40374063
* Get flags from an Ex command argument.
40384064
*/

src/testdir/test_vim9_script.vim

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ def Test_range_only()
1515
setline(1, ['blah', 'Blah'])
1616
:/Blah/
1717
assert_equal(2, getcurpos()[1])
18+
bwipe!
19+
20+
# without range commands use current line
21+
new
22+
setline(1, ['one', 'two', 'three'])
23+
:2
24+
print
25+
assert_equal('two', Screenline(&lines))
26+
:3
27+
list
28+
assert_equal('three$', Screenline(&lines))
29+
bwipe!
1830
enddef
1931

2032
let s:appendToMe = 'xxx'

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ static char *(features[]) =
754754

755755
static int included_patches[] =
756756
{ /* Add new patch number below this line */
757+
/**/
758+
1519,
757759
/**/
758760
1518,
759761
/**/

0 commit comments

Comments
 (0)