@@ -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 );
6970static 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 );
7072static 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 */
0 commit comments