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 }