Mercurial > vim
diff 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 |
line wrap: on
line diff
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -135,7 +135,7 @@ static int getargopt __ARGS((exarg_T *ea #endif static int check_more __ARGS((int, int)); -static linenr_T get_address __ARGS((char_u **, int addr_type, int skip, int to_other_file)); +static linenr_T get_address __ARGS((exarg_T *, char_u **, int addr_type, int skip, int to_other_file)); static void get_flags __ARGS((exarg_T *eap)); #if !defined(FEAT_PERL) \ || !defined(FEAT_PYTHON) || !defined(FEAT_PYTHON3) \ @@ -2173,9 +2173,12 @@ do_one_cmd(cmdlinep, sourcing, lnum = CURRENT_TAB_NR; ea.line2 = lnum; break; + case ADDR_QUICKFIX: + ea.line2 = qf_get_cur_valid_idx(&ea); + break; } ea.cmd = skipwhite(ea.cmd); - lnum = get_address(&ea.cmd, ea.addr_type, ea.skip, ea.addr_count == 0); + lnum = get_address(&ea, &ea.cmd, ea.addr_type, ea.skip, ea.addr_count == 0); if (ea.cmd == NULL) /* error detected */ goto doend; if (lnum == MAXLNUM) @@ -2233,6 +2236,12 @@ do_one_cmd(cmdlinep, sourcing, ea.line2 = ARGCOUNT; } break; + case ADDR_QUICKFIX: + ea.line1 = 1; + ea.line2 = qf_get_size(&ea); + if (ea.line2 == 0) + ea.line2 = 1; + break; } ++ea.addr_count; } @@ -2693,6 +2702,11 @@ do_one_cmd(cmdlinep, sourcing, else ea.line2 = ARGCOUNT; break; + case ADDR_QUICKFIX: + ea.line2 = qf_get_size(&ea); + if (ea.line2 == 0) + ea.line2 = 1; + break; } } @@ -3839,6 +3853,8 @@ set_one_cmd_context(xp, buff) case CMD_botright: case CMD_browse: case CMD_bufdo: + case CMD_cdo: + case CMD_cfdo: case CMD_confirm: case CMD_debug: case CMD_folddoclosed: @@ -3848,7 +3864,9 @@ set_one_cmd_context(xp, buff) case CMD_keepjumps: case CMD_keepmarks: case CMD_keeppatterns: + case CMD_ldo: case CMD_leftabove: + case CMD_lfdo: case CMD_lockmarks: case CMD_noautocmd: case CMD_noswapfile: @@ -4321,7 +4339,8 @@ skip_range(cmd, ctx) * Return MAXLNUM when no Ex address was found. */ static linenr_T -get_address(ptr, addr_type, skip, to_other_file) +get_address(eap, ptr, addr_type, skip, to_other_file) + exarg_T *eap; char_u **ptr; int addr_type; /* flag: one of ADDR_LINES, ... */ int skip; /* only skip the address, don't use it */ @@ -4362,6 +4381,9 @@ get_address(ptr, addr_type, skip, to_oth case ADDR_TABS: lnum = CURRENT_TAB_NR; break; + case ADDR_QUICKFIX: + lnum = qf_get_cur_valid_idx(eap); + break; } break; @@ -4394,6 +4416,11 @@ get_address(ptr, addr_type, skip, to_oth case ADDR_TABS: lnum = LAST_TAB_NR; break; + case ADDR_QUICKFIX: + lnum = qf_get_size(eap); + if (lnum == 0) + lnum = 1; + break; } break; @@ -4569,6 +4596,9 @@ get_address(ptr, addr_type, skip, to_oth case ADDR_TABS: lnum = CURRENT_TAB_NR; break; + case ADDR_QUICKFIX: + lnum = qf_get_cur_valid_idx(eap); + break; } } @@ -4707,6 +4737,10 @@ invalid_range(eap) if (eap->line2 > LAST_TAB_NR) return (char_u *)_(e_invrange); break; + case ADDR_QUICKFIX: + if (eap->line2 != 1 && eap->line2 > qf_get_size(eap)) + return (char_u *)_(e_invrange); + break; } } return NULL; @@ -5817,6 +5851,7 @@ static struct {ADDR_TABS, "tabs"}, {ADDR_BUFFERS, "buffers"}, {ADDR_WINDOWS, "windows"}, + {ADDR_QUICKFIX, "quickfix"}, {-1, NULL} }; #endif @@ -9224,7 +9259,7 @@ ex_copymove(eap) { long n; - n = get_address(&eap->arg, eap->addr_type, FALSE, FALSE); + n = get_address(eap, &eap->arg, eap->addr_type, FALSE, FALSE); if (eap->arg == NULL) /* error detected */ { eap->nextcmd = NULL;