Mercurial > vim
comparison src/ex_docmd.c @ 7092:64e30831fa42 v7.4.858
commit https://github.com/vim/vim/commit/aa23b379421aa214e6543b06c974594a25799b09
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Sep 8 18:46:31 2015 +0200
patch 7.4.858
Problem: It's a bit clumsy to execute a command on a list of matches.
Solution: Add the ":ldo", ":lfdo", ":cdo" and ":cfdo" commands. (Yegappan
Lakshmanan)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 08 Sep 2015 19:00:05 +0200 |
parents | 5ea5bd9c18d2 |
children | f4456e686406 |
comparison
equal
deleted
inserted
replaced
7091:0f1600f46238 | 7092:64e30831fa42 |
---|---|
133 #if !defined(FEAT_QUICKFIX) || !defined(FEAT_EVAL) | 133 #if !defined(FEAT_QUICKFIX) || !defined(FEAT_EVAL) |
134 # define ex_cexpr ex_ni | 134 # define ex_cexpr ex_ni |
135 #endif | 135 #endif |
136 | 136 |
137 static int check_more __ARGS((int, int)); | 137 static int check_more __ARGS((int, int)); |
138 static linenr_T get_address __ARGS((char_u **, int addr_type, int skip, int to_other_file)); | 138 static linenr_T get_address __ARGS((exarg_T *, char_u **, int addr_type, int skip, int to_other_file)); |
139 static void get_flags __ARGS((exarg_T *eap)); | 139 static void get_flags __ARGS((exarg_T *eap)); |
140 #if !defined(FEAT_PERL) \ | 140 #if !defined(FEAT_PERL) \ |
141 || !defined(FEAT_PYTHON) || !defined(FEAT_PYTHON3) \ | 141 || !defined(FEAT_PYTHON) || !defined(FEAT_PYTHON3) \ |
142 || !defined(FEAT_TCL) \ | 142 || !defined(FEAT_TCL) \ |
143 || !defined(FEAT_RUBY) \ | 143 || !defined(FEAT_RUBY) \ |
2171 break; | 2171 break; |
2172 case ADDR_TABS: | 2172 case ADDR_TABS: |
2173 lnum = CURRENT_TAB_NR; | 2173 lnum = CURRENT_TAB_NR; |
2174 ea.line2 = lnum; | 2174 ea.line2 = lnum; |
2175 break; | 2175 break; |
2176 case ADDR_QUICKFIX: | |
2177 ea.line2 = qf_get_cur_valid_idx(&ea); | |
2178 break; | |
2176 } | 2179 } |
2177 ea.cmd = skipwhite(ea.cmd); | 2180 ea.cmd = skipwhite(ea.cmd); |
2178 lnum = get_address(&ea.cmd, ea.addr_type, ea.skip, ea.addr_count == 0); | 2181 lnum = get_address(&ea, &ea.cmd, ea.addr_type, ea.skip, ea.addr_count == 0); |
2179 if (ea.cmd == NULL) /* error detected */ | 2182 if (ea.cmd == NULL) /* error detected */ |
2180 goto doend; | 2183 goto doend; |
2181 if (lnum == MAXLNUM) | 2184 if (lnum == MAXLNUM) |
2182 { | 2185 { |
2183 if (*ea.cmd == '%') /* '%' - all lines */ | 2186 if (*ea.cmd == '%') /* '%' - all lines */ |
2231 { | 2234 { |
2232 ea.line1 = 1; | 2235 ea.line1 = 1; |
2233 ea.line2 = ARGCOUNT; | 2236 ea.line2 = ARGCOUNT; |
2234 } | 2237 } |
2235 break; | 2238 break; |
2239 case ADDR_QUICKFIX: | |
2240 ea.line1 = 1; | |
2241 ea.line2 = qf_get_size(&ea); | |
2242 if (ea.line2 == 0) | |
2243 ea.line2 = 1; | |
2244 break; | |
2236 } | 2245 } |
2237 ++ea.addr_count; | 2246 ++ea.addr_count; |
2238 } | 2247 } |
2239 /* '*' - visual area */ | 2248 /* '*' - visual area */ |
2240 else if (*ea.cmd == '*' && vim_strchr(p_cpo, CPO_STAR) == NULL) | 2249 else if (*ea.cmd == '*' && vim_strchr(p_cpo, CPO_STAR) == NULL) |
2690 case ADDR_ARGUMENTS: | 2699 case ADDR_ARGUMENTS: |
2691 if (ARGCOUNT == 0) | 2700 if (ARGCOUNT == 0) |
2692 ea.line1 = ea.line2 = 0; | 2701 ea.line1 = ea.line2 = 0; |
2693 else | 2702 else |
2694 ea.line2 = ARGCOUNT; | 2703 ea.line2 = ARGCOUNT; |
2704 break; | |
2705 case ADDR_QUICKFIX: | |
2706 ea.line2 = qf_get_size(&ea); | |
2707 if (ea.line2 == 0) | |
2708 ea.line2 = 1; | |
2695 break; | 2709 break; |
2696 } | 2710 } |
2697 } | 2711 } |
2698 | 2712 |
2699 /* accept numbered register only when no count allowed (:put) */ | 2713 /* accept numbered register only when no count allowed (:put) */ |
3837 case CMD_argdo: | 3851 case CMD_argdo: |
3838 case CMD_belowright: | 3852 case CMD_belowright: |
3839 case CMD_botright: | 3853 case CMD_botright: |
3840 case CMD_browse: | 3854 case CMD_browse: |
3841 case CMD_bufdo: | 3855 case CMD_bufdo: |
3856 case CMD_cdo: | |
3857 case CMD_cfdo: | |
3842 case CMD_confirm: | 3858 case CMD_confirm: |
3843 case CMD_debug: | 3859 case CMD_debug: |
3844 case CMD_folddoclosed: | 3860 case CMD_folddoclosed: |
3845 case CMD_folddoopen: | 3861 case CMD_folddoopen: |
3846 case CMD_hide: | 3862 case CMD_hide: |
3847 case CMD_keepalt: | 3863 case CMD_keepalt: |
3848 case CMD_keepjumps: | 3864 case CMD_keepjumps: |
3849 case CMD_keepmarks: | 3865 case CMD_keepmarks: |
3850 case CMD_keeppatterns: | 3866 case CMD_keeppatterns: |
3867 case CMD_ldo: | |
3851 case CMD_leftabove: | 3868 case CMD_leftabove: |
3869 case CMD_lfdo: | |
3852 case CMD_lockmarks: | 3870 case CMD_lockmarks: |
3853 case CMD_noautocmd: | 3871 case CMD_noautocmd: |
3854 case CMD_noswapfile: | 3872 case CMD_noswapfile: |
3855 case CMD_rightbelow: | 3873 case CMD_rightbelow: |
3856 case CMD_sandbox: | 3874 case CMD_sandbox: |
4319 * Set ptr to NULL when an error is encountered. | 4337 * Set ptr to NULL when an error is encountered. |
4320 * | 4338 * |
4321 * Return MAXLNUM when no Ex address was found. | 4339 * Return MAXLNUM when no Ex address was found. |
4322 */ | 4340 */ |
4323 static linenr_T | 4341 static linenr_T |
4324 get_address(ptr, addr_type, skip, to_other_file) | 4342 get_address(eap, ptr, addr_type, skip, to_other_file) |
4343 exarg_T *eap; | |
4325 char_u **ptr; | 4344 char_u **ptr; |
4326 int addr_type; /* flag: one of ADDR_LINES, ... */ | 4345 int addr_type; /* flag: one of ADDR_LINES, ... */ |
4327 int skip; /* only skip the address, don't use it */ | 4346 int skip; /* only skip the address, don't use it */ |
4328 int to_other_file; /* flag: may jump to other file */ | 4347 int to_other_file; /* flag: may jump to other file */ |
4329 { | 4348 { |
4359 case ADDR_BUFFERS: | 4378 case ADDR_BUFFERS: |
4360 lnum = curbuf->b_fnum; | 4379 lnum = curbuf->b_fnum; |
4361 break; | 4380 break; |
4362 case ADDR_TABS: | 4381 case ADDR_TABS: |
4363 lnum = CURRENT_TAB_NR; | 4382 lnum = CURRENT_TAB_NR; |
4383 break; | |
4384 case ADDR_QUICKFIX: | |
4385 lnum = qf_get_cur_valid_idx(eap); | |
4364 break; | 4386 break; |
4365 } | 4387 } |
4366 break; | 4388 break; |
4367 | 4389 |
4368 case '$': /* '$' - last line */ | 4390 case '$': /* '$' - last line */ |
4391 case ADDR_BUFFERS: | 4413 case ADDR_BUFFERS: |
4392 lnum = lastbuf->b_fnum; | 4414 lnum = lastbuf->b_fnum; |
4393 break; | 4415 break; |
4394 case ADDR_TABS: | 4416 case ADDR_TABS: |
4395 lnum = LAST_TAB_NR; | 4417 lnum = LAST_TAB_NR; |
4418 break; | |
4419 case ADDR_QUICKFIX: | |
4420 lnum = qf_get_size(eap); | |
4421 if (lnum == 0) | |
4422 lnum = 1; | |
4396 break; | 4423 break; |
4397 } | 4424 } |
4398 break; | 4425 break; |
4399 | 4426 |
4400 case '\'': /* ''' - mark */ | 4427 case '\'': /* ''' - mark */ |
4567 lnum = curbuf->b_fnum; | 4594 lnum = curbuf->b_fnum; |
4568 break; | 4595 break; |
4569 case ADDR_TABS: | 4596 case ADDR_TABS: |
4570 lnum = CURRENT_TAB_NR; | 4597 lnum = CURRENT_TAB_NR; |
4571 break; | 4598 break; |
4599 case ADDR_QUICKFIX: | |
4600 lnum = qf_get_cur_valid_idx(eap); | |
4601 break; | |
4572 } | 4602 } |
4573 } | 4603 } |
4574 | 4604 |
4575 if (VIM_ISDIGIT(*cmd)) | 4605 if (VIM_ISDIGIT(*cmd)) |
4576 i = '+'; /* "number" is same as "+number" */ | 4606 i = '+'; /* "number" is same as "+number" */ |
4705 break; | 4735 break; |
4706 case ADDR_TABS: | 4736 case ADDR_TABS: |
4707 if (eap->line2 > LAST_TAB_NR) | 4737 if (eap->line2 > LAST_TAB_NR) |
4708 return (char_u *)_(e_invrange); | 4738 return (char_u *)_(e_invrange); |
4709 break; | 4739 break; |
4740 case ADDR_QUICKFIX: | |
4741 if (eap->line2 != 1 && eap->line2 > qf_get_size(eap)) | |
4742 return (char_u *)_(e_invrange); | |
4743 break; | |
4710 } | 4744 } |
4711 } | 4745 } |
4712 return NULL; | 4746 return NULL; |
4713 } | 4747 } |
4714 | 4748 |
5815 {ADDR_LINES, "lines"}, | 5849 {ADDR_LINES, "lines"}, |
5816 {ADDR_LOADED_BUFFERS, "loaded_buffers"}, | 5850 {ADDR_LOADED_BUFFERS, "loaded_buffers"}, |
5817 {ADDR_TABS, "tabs"}, | 5851 {ADDR_TABS, "tabs"}, |
5818 {ADDR_BUFFERS, "buffers"}, | 5852 {ADDR_BUFFERS, "buffers"}, |
5819 {ADDR_WINDOWS, "windows"}, | 5853 {ADDR_WINDOWS, "windows"}, |
5854 {ADDR_QUICKFIX, "quickfix"}, | |
5820 {-1, NULL} | 5855 {-1, NULL} |
5821 }; | 5856 }; |
5822 #endif | 5857 #endif |
5823 | 5858 |
5824 #if defined(FEAT_USR_CMDS) || defined(FEAT_EVAL) || defined(PROTO) | 5859 #if defined(FEAT_USR_CMDS) || defined(FEAT_EVAL) || defined(PROTO) |
9222 ex_copymove(eap) | 9257 ex_copymove(eap) |
9223 exarg_T *eap; | 9258 exarg_T *eap; |
9224 { | 9259 { |
9225 long n; | 9260 long n; |
9226 | 9261 |
9227 n = get_address(&eap->arg, eap->addr_type, FALSE, FALSE); | 9262 n = get_address(eap, &eap->arg, eap->addr_type, FALSE, FALSE); |
9228 if (eap->arg == NULL) /* error detected */ | 9263 if (eap->arg == NULL) /* error detected */ |
9229 { | 9264 { |
9230 eap->nextcmd = NULL; | 9265 eap->nextcmd = NULL; |
9231 return; | 9266 return; |
9232 } | 9267 } |