diff options
author | Florian Walch <florian@fwalch.com> | 2015-12-03 20:14:51 +0100 |
---|---|---|
committer | Florian Walch <florian@fwalch.com> | 2015-12-24 08:08:50 +0100 |
commit | 7f99d210fd6bf92619f295a439ee4ac7e1a8f353 (patch) | |
tree | 9e40030f51d4d157e3b01825dfd645d2c500ba6e /src/nvim/ex_docmd.c | |
parent | 25eaacd10fea833c1f915a9ae69678d3d1dc7501 (diff) | |
download | rneovim-7f99d210fd6bf92619f295a439ee4ac7e1a8f353.tar.gz rneovim-7f99d210fd6bf92619f295a439ee4ac7e1a8f353.tar.bz2 rneovim-7f99d210fd6bf92619f295a439ee4ac7e1a8f353.zip |
vim-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)
https://github.com/vim/vim/commit/aa23b379421aa214e6543b06c974594a25799b09
Diffstat (limited to 'src/nvim/ex_docmd.c')
-rw-r--r-- | src/nvim/ex_docmd.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 59bda9345e..fad497928c 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -1531,9 +1531,12 @@ static char_u * do_one_cmd(char_u **cmdlinep, 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) { @@ -1582,6 +1585,13 @@ static char_u * do_one_cmd(char_u **cmdlinep, 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; } @@ -1962,6 +1972,12 @@ static char_u * do_one_cmd(char_u **cmdlinep, ea.line2 = ARGCOUNT; } break; + case ADDR_QUICKFIX: + ea.line2 = qf_get_size(&ea); + if (ea.line2 == 0) { + ea.line2 = 1; + } + break; } } @@ -2945,6 +2961,8 @@ set_one_cmd_context ( case CMD_botright: case CMD_browse: case CMD_bufdo: + case CMD_cdo: + case CMD_cfdo: case CMD_confirm: case CMD_debug: case CMD_folddoclosed: @@ -2954,7 +2972,9 @@ set_one_cmd_context ( 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: @@ -3367,7 +3387,8 @@ skip_range ( * * Return MAXLNUM when no Ex address was found. */ -static linenr_T get_address(char_u **ptr, +static linenr_T get_address(exarg_T *eap, + char_u **ptr, int addr_type, // flag: one of ADDR_LINES, ... int skip, // only skip the address, don't use it int to_other_file // flag: may jump to other file @@ -3405,6 +3426,9 @@ static linenr_T get_address(char_u **ptr, case ADDR_TABS: lnum = CURRENT_TAB_NR; break; + case ADDR_QUICKFIX: + lnum = qf_get_cur_valid_idx(eap); + break; } break; @@ -3436,6 +3460,12 @@ static linenr_T get_address(char_u **ptr, case ADDR_TABS: lnum = LAST_TAB_NR; break; + case ADDR_QUICKFIX: + lnum = qf_get_size(eap); + if (lnum == 0) { + lnum = 1; + } + break; } break; @@ -3578,6 +3608,9 @@ static linenr_T get_address(char_u **ptr, case ADDR_TABS: lnum = CURRENT_TAB_NR; break; + case ADDR_QUICKFIX: + lnum = qf_get_cur_valid_idx(eap); + break; } } @@ -3702,6 +3735,12 @@ static char_u *invalid_range(exarg_T *eap) return (char_u *)_(e_invrange); } break; + case ADDR_QUICKFIX: + assert(eap->line2 >= 0); + if (eap->line2 != 1 && (size_t)eap->line2 > qf_get_size(eap)) { + return (char_u *)_(e_invrange); + } + break; } } return NULL; @@ -4589,6 +4628,7 @@ static struct { {ADDR_TABS, "tabs"}, {ADDR_BUFFERS, "buffers"}, {ADDR_WINDOWS, "windows"}, + {ADDR_QUICKFIX, "quickfix"}, {-1, NULL} }; @@ -7013,9 +7053,7 @@ static void ex_put(exarg_T *eap) */ static void ex_copymove(exarg_T *eap) { - long n; - - n = get_address(&eap->arg, eap->addr_type, FALSE, FALSE); + long n = get_address(eap, &eap->arg, eap->addr_type, false, false); if (eap->arg == NULL) { /* error detected */ eap->nextcmd = NULL; return; |