0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

updated for version 7.4.566

Problem:    :argdo, :bufdo, :windo and :tabdo don't take a range.
Solution:   Support the range. (Marcin Szamotulski)
This commit is contained in:
Bram Moolenaar
2015-01-07 16:54:21 +01:00
parent 3ffc79a4a8
commit a162bc555e
8 changed files with 102 additions and 25 deletions

View File

@@ -1,4 +1,4 @@
*editing.txt* For Vim version 7.4. Last change: 2014 Dec 05 *editing.txt* For Vim version 7.4. Last change: 2015 Jan 04
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -832,8 +832,9 @@ current window. The two windows then share this list, until one of them uses
USING THE ARGUMENT LIST USING THE ARGUMENT LIST
*:argdo* *:argdo*
:argdo[!] {cmd} Execute {cmd} for each file in the argument list. :[range]argdo[!] {cmd} Execute {cmd} for each file in the argument list or
It works like doing this: > if [range] is specified only for arguments in that
range. It works like doing this: >
:rewind :rewind
:{cmd} :{cmd}
:next :next
@@ -1391,7 +1392,7 @@ reveal it to others. The 'viminfo' file is not encrypted.
You could do this to edit very secret text: > You could do this to edit very secret text: >
:set noundofile viminfo= :set noundofile viminfo=
:noswapfile edit secrets.txt :noswapfile edit secrets.txt
Keep in mind that without a swap file you risk loosing your work in a crash. Keep in mind that without a swap file you risk losing your work in a crash.
WARNING: If you make a typo when entering the key and then write the file and WARNING: If you make a typo when entering the key and then write the file and
exit, the text will be lost! exit, the text will be lost!

View File

@@ -1,4 +1,4 @@
*tabpage.txt* For Vim version 7.4. Last change: 2014 Nov 27 *tabpage.txt* For Vim version 7.4. Last change: 2015 Jan 04
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -206,7 +206,7 @@ REORDERING TAB PAGES:
:tabmove " move the tab page to the right :tabmove " move the tab page to the right
:.tabmove " as above :.tabmove " as above
:+tabmove " as above :+tabmove " as above
:0tabmove " move the tab page to the begining of the tab :0tabmove " move the tab page to the beginning of the tab
" list " list
:$tabmove " move the tab page to the end of the tab list :$tabmove " move the tab page to the end of the tab list
< <
@@ -224,8 +224,10 @@ clarification what +N means in this context see |[range]|.
LOOPING OVER TAB PAGES: LOOPING OVER TAB PAGES:
*:tabd* *:tabdo* *:tabd* *:tabdo*
:tabd[o] {cmd} Execute {cmd} in each tab page. :[range]tabd[o] {cmd}
It works like doing this: > Execute {cmd} in each tab page or if [range] is given only in
tab pages which tab page number is in the [range]. It works
like doing this: >
:tabfirst :tabfirst
:{cmd} :{cmd}
:tabnext :tabnext
@@ -271,8 +273,8 @@ window on the same buffer and then edit another buffer. Thus ":tabnew"
triggers: triggers:
WinLeave leave current window WinLeave leave current window
TabLeave leave current tab page TabLeave leave current tab page
TabEnter enter new tab page
WinEnter enter window in new tab page WinEnter enter window in new tab page
TabEnter enter new tab page
BufLeave leave current buffer BufLeave leave current buffer
BufEnter enter new empty buffer BufEnter enter new empty buffer

View File

@@ -698,8 +698,9 @@ can also get to them with the buffer list commands, like ":bnext".
8. Do a command in all buffers or windows *list-repeat* 8. Do a command in all buffers or windows *list-repeat*
*:windo* *:windo*
:windo {cmd} Execute {cmd} in each window. :[range]windo {cmd} Execute {cmd} in each window or if [range] is given
It works like doing this: > only in windows for which the window number lies in
the [range]. It works like doing this: >
CTRL-W t CTRL-W t
:{cmd} :{cmd}
CTRL-W w CTRL-W w
@@ -717,8 +718,10 @@ can also get to them with the buffer list commands, like ":bnext".
Also see |:tabdo|, |:argdo| and |:bufdo|. Also see |:tabdo|, |:argdo| and |:bufdo|.
*:bufdo* *:bufdo*
:bufdo[!] {cmd} Execute {cmd} in each buffer in the buffer list. :[range]bufdo[!] {cmd} Execute {cmd} in each buffer in the buffer list or if
It works like doing this: > [range] is given only for buffers for which their
buffer numer is in the [range]. It works like doing
this: >
:bfirst :bfirst
:{cmd} :{cmd}
:bnext :bnext

View File

@@ -133,8 +133,8 @@ EX(CMD_argdelete, "argdelete", ex_argdelete,
BANG|RANGE|NOTADR|FILES|TRLBAR, BANG|RANGE|NOTADR|FILES|TRLBAR,
ADDR_ARGUMENTS), ADDR_ARGUMENTS),
EX(CMD_argdo, "argdo", ex_listdo, EX(CMD_argdo, "argdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM, BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
ADDR_LINES), ADDR_ARGUMENTS),
EX(CMD_argedit, "argedit", ex_argedit, EX(CMD_argedit, "argedit", ex_argedit,
BANG|NEEDARG|RANGE|NOTADR|FILE1|EDITCMD|ARGOPT|TRLBAR, BANG|NEEDARG|RANGE|NOTADR|FILE1|EDITCMD|ARGOPT|TRLBAR,
ADDR_ARGUMENTS), ADDR_ARGUMENTS),
@@ -220,8 +220,8 @@ EX(CMD_buffers, "buffers", buflist_list,
BANG|TRLBAR|CMDWIN, BANG|TRLBAR|CMDWIN,
ADDR_LINES), ADDR_LINES),
EX(CMD_bufdo, "bufdo", ex_listdo, EX(CMD_bufdo, "bufdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM, BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
ADDR_LINES), ADDR_BUFFERS),
EX(CMD_bunload, "bunload", ex_bunload, EX(CMD_bunload, "bunload", ex_bunload,
BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR, BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
ADDR_LOADED_BUFFERS), ADDR_LOADED_BUFFERS),
@@ -1384,8 +1384,8 @@ EX(CMD_tabclose, "tabclose", ex_tabclose,
RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN, RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN,
ADDR_TABS), ADDR_TABS),
EX(CMD_tabdo, "tabdo", ex_listdo, EX(CMD_tabdo, "tabdo", ex_listdo,
NEEDARG|EXTRA|NOTRLCOM, NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
ADDR_LINES), ADDR_TABS),
EX(CMD_tabedit, "tabedit", ex_splitview, EX(CMD_tabedit, "tabedit", ex_splitview,
BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR, BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR,
ADDR_TABS), ADDR_TABS),
@@ -1576,8 +1576,8 @@ EX(CMD_wincmd, "wincmd", ex_wincmd,
NEEDARG|WORD1|RANGE|NOTADR, NEEDARG|WORD1|RANGE|NOTADR,
ADDR_WINDOWS), ADDR_WINDOWS),
EX(CMD_windo, "windo", ex_listdo, EX(CMD_windo, "windo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM, BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
ADDR_LINES), ADDR_WINDOWS),
EX(CMD_winpos, "winpos", ex_winpos, EX(CMD_winpos, "winpos", ex_winpos,
EXTRA|TRLBAR|CMDWIN, EXTRA|TRLBAR|CMDWIN,
ADDR_LINES), ADDR_LINES),

View File

@@ -2472,15 +2472,36 @@ ex_listdo(eap)
| (eap->forceit ? CCGD_FORCEIT : 0) | (eap->forceit ? CCGD_FORCEIT : 0)
| CCGD_EXCMD)) | CCGD_EXCMD))
{ {
/* start at the first argument/window/buffer */
i = 0; i = 0;
/* start at the eap->line1 argument/window/buffer */
#ifdef FEAT_WINDOWS #ifdef FEAT_WINDOWS
wp = firstwin; wp = firstwin;
tp = first_tabpage; tp = first_tabpage;
#endif #endif
switch (eap->cmdidx)
{
#ifdef FEAT_WINDOWS
case CMD_windo:
for ( ; wp != NULL && i + 1 < eap->line1; wp = wp->w_next)
i++;
break;
case CMD_tabdo:
for( ; tp != NULL && i + 1 < eap->line1; tp = tp->tp_next)
i++;
break;
#endif
case CMD_argdo:
i = eap->line1 - 1;
break;
case CMD_bufdo:
i = eap->line1;
break;
default:
break;
}
/* set pcmark now */ /* set pcmark now */
if (eap->cmdidx == CMD_bufdo) if (eap->cmdidx == CMD_bufdo)
goto_buffer(eap, DOBUF_FIRST, FORWARD, 0); goto_buffer(eap, DOBUF_FIRST, FORWARD, i);
else else
setpcmark(); setpcmark();
listcmd_busy = TRUE; /* avoids setting pcmark below */ listcmd_busy = TRUE; /* avoids setting pcmark below */
@@ -2506,7 +2527,6 @@ ex_listdo(eap)
} }
if (curwin->w_arg_idx != i) if (curwin->w_arg_idx != i)
break; break;
++i;
} }
#ifdef FEAT_WINDOWS #ifdef FEAT_WINDOWS
else if (eap->cmdidx == CMD_windo) else if (eap->cmdidx == CMD_windo)
@@ -2541,6 +2561,8 @@ ex_listdo(eap)
} }
} }
++i;
/* execute the command */ /* execute the command */
do_cmdline(eap->arg, eap->getline, eap->cookie, do_cmdline(eap->arg, eap->getline, eap->cookie,
DOCMD_VERBOSE + DOCMD_NOWAIT); DOCMD_VERBOSE + DOCMD_NOWAIT);
@@ -2548,7 +2570,7 @@ ex_listdo(eap)
if (eap->cmdidx == CMD_bufdo) if (eap->cmdidx == CMD_bufdo)
{ {
/* Done? */ /* Done? */
if (next_fnum < 0) if (next_fnum < 0 || next_fnum > eap->line2)
break; break;
/* Check if the buffer still exists. */ /* Check if the buffer still exists. */
for (buf = firstbuf; buf != NULL; buf = buf->b_next) for (buf = firstbuf; buf != NULL; buf = buf->b_next)
@@ -2579,6 +2601,14 @@ ex_listdo(eap)
do_check_scrollbind(TRUE); do_check_scrollbind(TRUE);
#endif #endif
} }
#ifdef FEAT_WINDOWS
if (eap->cmdidx == CMD_windo || eap->cmdidx == CMD_tabdo)
if (i+1 > eap->line2)
break;
#endif
if (eap->cmdidx == CMD_argdo && i >= eap->line2)
break;
} }
listcmd_busy = FALSE; listcmd_busy = FALSE;
} }

View File

@@ -90,6 +90,40 @@ STARTTEST
:only! :only!
:e! test.out :e! test.out
:call append(0, g:lines) :call append(0, g:lines)
:unlet g:lines
:w|bd
:se hidden
:b1
ENDTEST
STARTTEST
:only!
:let g:lines = []
:%argd
:arga a b c d e f
:3argu
:let args = ''
:.,$-argdo let args .= ' '.expand('%')
:call add(g:lines, 'argdo:' . args)
:split|split|split|split
:2wincmd w
:let windows = ''
:.,$-windo let windows .= ' '.winnr()
:call add(g:lines, 'windo:'. windows)
:b2
:let buffers = ''
:.,$-bufdo let buffers .= ' '.bufnr('%')
:call add(g:lines, 'bufdo:' . buffers)
:let buffers = ''
:3,7bufdo let buffers .= ' '.bufnr('%')
:call add(g:lines, 'bufdo:' . buffers)
:tabe|tabe|tabe|tabe
:normal! 2gt
:let tabpages = ''
:.,$-tabdo let tabpages .= ' '.tabpagenr()
:call add(g:lines, 'tabdo:' . tabpages)
:e! test.out
:call append('$', g:lines)
:w|qa! :w|qa!
ENDTEST ENDTEST

View File

@@ -28,3 +28,8 @@ $tabe 2
$+tabe E16: Invalid range $+tabe E16: Invalid range
0tabm x 0tabm x
argdo: c d e
windo: 2 3 4
bufdo: 2 3 4 5 6 7 8 9 10 12
bufdo: 3 4 5 6 7
tabdo: 2 3 4

View File

@@ -741,6 +741,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
566,
/**/ /**/
565, 565,
/**/ /**/