Patch 7.4.566
Problem:    :argdo, :bufdo, :windo and :tabdo don't take a range.
Solution:   Support the range. (Marcin Szamotulski)
Files:      runtime/doc/editing.txt, runtime/doc/tabpage.txt,
            runtime/doc/windows.txt, src/ex_cmds.h, src/ex_cmds2.c,
            src/testdir/test_command_count.in,
            src/testdir/test_command_count.ok


*** ../vim-7.4.565/runtime/doc/editing.txt      2014-11-27 16:22:42.734413130 
+0100
--- runtime/doc/editing.txt     2015-01-07 16:09:20.501100753 +0100
***************
*** 38,43 ****
--- 38,44 ----
  file name.  It can be used with "#" on the command line |:_#| and you can use
  the |CTRL-^| command to toggle between the current and the alternate file.
  However, the alternate file name is not changed when |:keepalt| is used.
+ An alternate file name is remembered for each window.
  
                                                        *:keepalt* *:keepa*
  :keepalt {cmd}                Execute {cmd} while keeping the current 
alternate file
***************
*** 610,616 ****
  :[count]arga[dd] {name} ..                    *:arga* *:argadd* *E479*
  :[count]arga[dd]
                        Add the {name}s to the argument list.  When {name} is
!                       omitted at the current buffer name to the argument
                        list.
                        If [count] is omitted, the {name}s are added just
                        after the current entry in the argument list.
--- 611,617 ----
  :[count]arga[dd] {name} ..                    *:arga* *:argadd* *E479*
  :[count]arga[dd]
                        Add the {name}s to the argument list.  When {name} is
!                       omitted add the current buffer name to the argument
                        list.
                        If [count] is omitted, the {name}s are added just
                        after the current entry in the argument list.
***************
*** 831,838 ****
  USING THE ARGUMENT LIST
  
                                                *:argdo*
! :argdo[!] {cmd}               Execute {cmd} for each file in the argument 
list.
!                       It works like doing this: >
                                :rewind
                                :{cmd}
                                :next
--- 832,840 ----
  USING THE ARGUMENT LIST
  
                                                *:argdo*
! :[range]argdo[!] {cmd}        Execute {cmd} for each file in the argument 
list or
!                       if [range] is specified only for arguments in that
!                       range.  It works like doing this: >
                                :rewind
                                :{cmd}
                                :next
***************
*** 1090,1096 ****
  
  :q[uit]!              Quit without writing, also when currently visible
                        buffers have changes.  Does not exit when this is the
!                       last window and there are is a changed hidden buffer.
                        In this case, the first changed hidden buffer becomes
                        the current buffer.
                        Use ":qall!" to exit always.
--- 1092,1098 ----
  
  :q[uit]!              Quit without writing, also when currently visible
                        buffers have changes.  Does not exit when this is the
!                       last window and there is a changed hidden buffer.
                        In this case, the first changed hidden buffer becomes
                        the current buffer.
                        Use ":qall!" to exit always.
***************
*** 1390,1396 ****
  You could do this to edit very secret text: >
        :set noundofile viminfo=
        :noswapfile edit secrets.txt
! Keep in mind that without a swap file you risk loosing your work in a crash.
  
  WARNING: If you make a typo when entering the key and then write the file and
  exit, the text will be lost!
--- 1392,1398 ----
  You could do this to edit very secret text: >
        :set noundofile viminfo=
        :noswapfile edit secrets.txt
! 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
  exit, the text will be lost!
***************
*** 1426,1438 ****
  set automatically to the method used when that file was written.  You can
  change 'cryptmethod' before writing that file to change the method.
  
! To set the default method, used for new files, use one of these in your
! |vimrc| file: >
!       set cm=zip
        set cm=blowfish2
! Use the first one if you need to be compatible with Vim 7.2 and older.  Using
! "blowfish2" is highly recommended if you can use a Vim version that supports
! it.
  
  The message given for reading and writing a file will show "[crypted]" when
  using zip, "[blowfish]" when using blowfish, etc.
--- 1428,1438 ----
  set automatically to the method used when that file was written.  You can
  change 'cryptmethod' before writing that file to change the method.
  
! To set the default method, used for new files, use this in your |vimrc| 
! file: >
        set cm=blowfish2
! Using "blowfish2" is highly recommended.  Only use another method if you
! must use an older Vim version that does not support it.
  
  The message given for reading and writing a file will show "[crypted]" when
  using zip, "[blowfish]" when using blowfish, etc.
***************
*** 1494,1501 ****
  - Pkzip uses the same encryption as 'cryptmethod' "zip", and US Govt has no
    objection to its export.  Pkzip's public file APPNOTE.TXT describes this
    algorithm in detail.
! - The implmentation of 'cryptmethod' "blowfish" has a flaw.  It is possible to
!   crack the first 64 bytes of a file and in some circumstances more of the
    file. Use of it is not recommended, but it's still the strongest method
    supported by Vim 7.3 and 7.4.  The "zip" method is even weaker.
  - Vim originates from the Netherlands.  That is where the sources come from.
--- 1494,1501 ----
  - Pkzip uses the same encryption as 'cryptmethod' "zip", and US Govt has no
    objection to its export.  Pkzip's public file APPNOTE.TXT describes this
    algorithm in detail.
! - The implementation of 'cryptmethod' "blowfish" has a flaw.  It is possible
!   to crack the first 64 bytes of a file and in some circumstances more of the
    file. Use of it is not recommended, but it's still the strongest method
    supported by Vim 7.3 and 7.4.  The "zip" method is even weaker.
  - Vim originates from the Netherlands.  That is where the sources come from.
*** ../vim-7.4.565/runtime/doc/tabpage.txt      2014-11-27 16:22:42.738413084 
+0100
--- runtime/doc/tabpage.txt     2015-01-07 16:09:20.501100753 +0100
***************
*** 206,212 ****
                    :tabmove    " move the tab page to the right
                    :.tabmove   " as above
                    :+tabmove   " as above
!                   :0tabmove   " move the tab page to the begining of the tab
                                " list
                    :$tabmove   " move the tab page to the end of the tab list
  <
--- 206,212 ----
                    :tabmove    " move the tab page to the right
                    :.tabmove   " as above
                    :+tabmove   " as above
!                   :0tabmove   " move the tab page to the beginning of the tab
                                " list
                    :$tabmove   " move the tab page to the end of the tab list
  <
***************
*** 224,231 ****
  LOOPING OVER TAB PAGES:
  
                                                        *:tabd* *:tabdo*
! :tabd[o] {cmd}        Execute {cmd} in each tab page.
!               It works like doing this: >
                        :tabfirst
                        :{cmd}
                        :tabnext
--- 224,233 ----
  LOOPING OVER TAB PAGES:
  
                                                        *:tabd* *:tabdo*
! :[range]tabd[o] {cmd}
!               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
                        :{cmd}
                        :tabnext
***************
*** 271,278 ****
  triggers:
        WinLeave                leave current window
        TabLeave                leave current tab page
-       TabEnter                enter new tab page
        WinEnter                enter window in new tab page
        BufLeave                leave current buffer
        BufEnter                enter new empty buffer
  
--- 273,280 ----
  triggers:
        WinLeave                leave current window
        TabLeave                leave current tab page
        WinEnter                enter window in new tab page
+       TabEnter                enter new tab page
        BufLeave                leave current buffer
        BufEnter                enter new empty buffer
  
*** ../vim-7.4.565/runtime/doc/windows.txt      2014-11-30 14:50:12.255356230 
+0100
--- runtime/doc/windows.txt     2015-01-07 16:09:20.501100753 +0100
***************
*** 278,293 ****
                and there is only one window for the current buffer, and the
                buffer was changed, the command fails.
                
!               (Note: CTRL-Q does not
!               work on all terminals).  If [count] is greater than
!               the last window number the last window will be closed: >
                    :1quit  " quit the first window
                    :$quit  " quit the last window
                    :9quit  " quit the last window
                             " if there are less than 9 windows opened
                    :-quit  " quit the previews window
                    :+quit  " quit the next window
!                   :+2quit " will also work as expected
  <
  :q[uit]!
  :{count}q[uit]!
--- 278,294 ----
                and there is only one window for the current buffer, and the
                buffer was changed, the command fails.
                
!               (Note: CTRL-Q does not work on all terminals).
!               
!               If [count] is greater than the last window number the last
!               window will be closed: >
                    :1quit  " quit the first window
                    :$quit  " quit the last window
                    :9quit  " quit the last window
                             " if there are less than 9 windows opened
                    :-quit  " quit the previews window
                    :+quit  " quit the next window
!                   :+2quit " quit the second next window
  <
  :q[uit]!
  :{count}q[uit]!
***************
*** 332,340 ****
                screen.  For {count} see |:quit| command.
                
                The buffer becomes hidden (unless there is another window
!               editing it or 'bufhidden' is "unload" or "delete").  If the
!               window is the last one in the current tab page the tab page is
!               closed.  |tab-page| 
                
                The value of 'hidden' is irrelevant for this command.  Changes
                to the buffer are not written and won't get lost, so this is a
--- 333,341 ----
                screen.  For {count} see |:quit| command.
                
                The buffer becomes hidden (unless there is another window
!               editing it or 'bufhidden' is "unload", "delete" or "wipe").
!               If the window is the last one in the current tab page the tab
!               page is closed.  |tab-page| 
                
                The value of 'hidden' is irrelevant for this command.  Changes
                to the buffer are not written and won't get lost, so this is a
***************
*** 697,704 ****
  8. Do a command in all buffers or windows                     *list-repeat*
  
                                                        *:windo*
! :windo {cmd}          Execute {cmd} in each window.
!                       It works like doing this: >
                                CTRL-W t
                                :{cmd}
                                CTRL-W w
--- 698,706 ----
  8. Do a command in all buffers or windows                     *list-repeat*
  
                                                        *:windo*
! :[range]windo {cmd}   Execute {cmd} in each window or if [range] is given
!                       only in windows for which the window number lies in
!                       the [range].  It works like doing this: >
                                CTRL-W t
                                :{cmd}
                                CTRL-W w
***************
*** 716,723 ****
                        Also see |:tabdo|, |:argdo| and |:bufdo|.
  
                                                        *:bufdo*
! :bufdo[!] {cmd}               Execute {cmd} in each buffer in the buffer list.
!                       It works like doing this: >
                                :bfirst
                                :{cmd}
                                :bnext
--- 718,727 ----
                        Also see |:tabdo|, |:argdo| and |:bufdo|.
  
                                                        *:bufdo*
! :[range]bufdo[!] {cmd}        Execute {cmd} in each buffer in the buffer list 
or if
!                       [range] is given only for buffers for which their
!                       buffer numer is in the [range].  It works like doing
!                       this: >
                                :bfirst
                                :{cmd}
                                :bnext
***************
*** 763,780 ****
  
  CTRL-W ]                                      *CTRL-W_]* *CTRL-W_CTRL-]*
  CTRL-W CTRL-] Split current window in two.  Use identifier under cursor as a
!               tag and jump to it in the new upper window.  Make new window N
!               high.
  
                                                        *CTRL-W_g]*
  CTRL-W g ]    Split current window in two.  Use identifier under cursor as a
                tag and perform ":tselect" on it in the new upper window.
                Make new window N high.
  
                                                        *CTRL-W_g_CTRL-]*
  CTRL-W g CTRL-]       Split current window in two.  Use identifier under 
cursor as a
!               tag and perform ":tjump" on it in the new upper window.  Make
!               new window N high.
  
  CTRL-W f                                      *CTRL-W_f* *CTRL-W_CTRL-F*
  CTRL-W CTRL-F Split current window in two.  Edit file name under cursor.
--- 767,787 ----
  
  CTRL-W ]                                      *CTRL-W_]* *CTRL-W_CTRL-]*
  CTRL-W CTRL-] Split current window in two.  Use identifier under cursor as a
!               tag and jump to it in the new upper window.
!               In Visual mode uses the Visually selected text as a tag.
!               Make new window N high.
  
                                                        *CTRL-W_g]*
  CTRL-W g ]    Split current window in two.  Use identifier under cursor as a
                tag and perform ":tselect" on it in the new upper window.
+               In Visual mode uses the Visually selected text as a tag.
                Make new window N high.
  
                                                        *CTRL-W_g_CTRL-]*
  CTRL-W g CTRL-]       Split current window in two.  Use identifier under 
cursor as a
!               tag and perform ":tjump" on it in the new upper window.
!               In Visual mode uses the Visually selected text as a tag.
!               Make new window N high.
  
  CTRL-W f                                      *CTRL-W_f* *CTRL-W_CTRL-F*
  CTRL-W CTRL-F Split current window in two.  Edit file name under cursor.
*** ../vim-7.4.565/src/ex_cmds.h        2015-01-07 15:57:13.145559792 +0100
--- src/ex_cmds.h       2015-01-07 16:13:24.406265045 +0100
***************
*** 133,140 ****
                        BANG|RANGE|NOTADR|FILES|TRLBAR,
                        ADDR_ARGUMENTS),
  EX(CMD_argdo,         "argdo",        ex_listdo,
!                       BANG|NEEDARG|EXTRA|NOTRLCOM,
!                       ADDR_LINES),
  EX(CMD_argedit,               "argedit",      ex_argedit,
                        BANG|NEEDARG|RANGE|NOTADR|FILE1|EDITCMD|ARGOPT|TRLBAR,
                        ADDR_ARGUMENTS),
--- 133,140 ----
                        BANG|RANGE|NOTADR|FILES|TRLBAR,
                        ADDR_ARGUMENTS),
  EX(CMD_argdo,         "argdo",        ex_listdo,
!                       BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
!                       ADDR_ARGUMENTS),
  EX(CMD_argedit,               "argedit",      ex_argedit,
                        BANG|NEEDARG|RANGE|NOTADR|FILE1|EDITCMD|ARGOPT|TRLBAR,
                        ADDR_ARGUMENTS),
***************
*** 220,227 ****
                        BANG|TRLBAR|CMDWIN,
                        ADDR_LINES),
  EX(CMD_bufdo,         "bufdo",        ex_listdo,
!                       BANG|NEEDARG|EXTRA|NOTRLCOM,
!                       ADDR_LINES),
  EX(CMD_bunload,               "bunload",      ex_bunload,
                        BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
                        ADDR_LOADED_BUFFERS),
--- 220,227 ----
                        BANG|TRLBAR|CMDWIN,
                        ADDR_LINES),
  EX(CMD_bufdo,         "bufdo",        ex_listdo,
!                       BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
!                       ADDR_BUFFERS),
  EX(CMD_bunload,               "bunload",      ex_bunload,
                        BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
                        ADDR_LOADED_BUFFERS),
***************
*** 1384,1391 ****
                        RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN,
                        ADDR_TABS),
  EX(CMD_tabdo,         "tabdo",        ex_listdo,
!                       NEEDARG|EXTRA|NOTRLCOM,
!                       ADDR_LINES),
  EX(CMD_tabedit,               "tabedit",      ex_splitview,
                        BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR,
                        ADDR_TABS),
--- 1384,1391 ----
                        RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN,
                        ADDR_TABS),
  EX(CMD_tabdo,         "tabdo",        ex_listdo,
!                       NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
!                       ADDR_TABS),
  EX(CMD_tabedit,               "tabedit",      ex_splitview,
                        BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR,
                        ADDR_TABS),
***************
*** 1576,1583 ****
                        NEEDARG|WORD1|RANGE|NOTADR,
                        ADDR_WINDOWS),
  EX(CMD_windo,         "windo",        ex_listdo,
!                       BANG|NEEDARG|EXTRA|NOTRLCOM,
!                       ADDR_LINES),
  EX(CMD_winpos,                "winpos",       ex_winpos,
                        EXTRA|TRLBAR|CMDWIN,
                        ADDR_LINES),
--- 1576,1583 ----
                        NEEDARG|WORD1|RANGE|NOTADR,
                        ADDR_WINDOWS),
  EX(CMD_windo,         "windo",        ex_listdo,
!                       BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
!                       ADDR_WINDOWS),
  EX(CMD_winpos,                "winpos",       ex_winpos,
                        EXTRA|TRLBAR|CMDWIN,
                        ADDR_LINES),
*** ../vim-7.4.565/src/ex_cmds2.c       2014-11-19 16:38:01.512679964 +0100
--- src/ex_cmds2.c      2015-01-07 16:12:42.526751920 +0100
***************
*** 2472,2486 ****
                                    | (eap->forceit ? CCGD_FORCEIT : 0)
                                    | CCGD_EXCMD))
      {
-       /* start at the first argument/window/buffer */
        i = 0;
  #ifdef FEAT_WINDOWS
        wp = firstwin;
        tp = first_tabpage;
  #endif
        /* set pcmark now */
        if (eap->cmdidx == CMD_bufdo)
!           goto_buffer(eap, DOBUF_FIRST, FORWARD, 0);
        else
            setpcmark();
        listcmd_busy = TRUE;        /* avoids setting pcmark below */
--- 2472,2507 ----
                                    | (eap->forceit ? CCGD_FORCEIT : 0)
                                    | CCGD_EXCMD))
      {
        i = 0;
+       /* start at the eap->line1 argument/window/buffer */
  #ifdef FEAT_WINDOWS
        wp = firstwin;
        tp = first_tabpage;
  #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 */
        if (eap->cmdidx == CMD_bufdo)
!           goto_buffer(eap, DOBUF_FIRST, FORWARD, i);
        else
            setpcmark();
        listcmd_busy = TRUE;        /* avoids setting pcmark below */
***************
*** 2506,2512 ****
                }
                if (curwin->w_arg_idx != i)
                    break;
-               ++i;
            }
  #ifdef FEAT_WINDOWS
            else if (eap->cmdidx == CMD_windo)
--- 2527,2532 ----
***************
*** 2541,2546 ****
--- 2561,2568 ----
                    }
            }
  
+           ++i;
+ 
            /* execute the command */
            do_cmdline(eap->arg, eap->getline, eap->cookie,
                                                DOCMD_VERBOSE + DOCMD_NOWAIT);
***************
*** 2548,2554 ****
            if (eap->cmdidx == CMD_bufdo)
            {
                /* Done? */
!               if (next_fnum < 0)
                    break;
                /* Check if the buffer still exists. */
                for (buf = firstbuf; buf != NULL; buf = buf->b_next)
--- 2570,2576 ----
            if (eap->cmdidx == CMD_bufdo)
            {
                /* Done? */
!               if (next_fnum < 0 || next_fnum > eap->line2)
                    break;
                /* Check if the buffer still exists. */
                for (buf = firstbuf; buf != NULL; buf = buf->b_next)
***************
*** 2579,2584 ****
--- 2601,2614 ----
                    do_check_scrollbind(TRUE);
  #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;
      }
*** ../vim-7.4.565/src/testdir/test_command_count.in    2015-01-07 
15:57:13.145559792 +0100
--- src/testdir/test_command_count.in   2015-01-07 16:19:57.217698877 +0100
***************
*** 90,95 ****
--- 90,129 ----
  :only!
  :e! test.out
  :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!
  ENDTEST
  
*** ../vim-7.4.565/src/testdir/test_command_count.ok    2015-01-07 
15:57:13.145559792 +0100
--- src/testdir/test_command_count.ok   2015-01-07 16:19:51.805761782 +0100
***************
*** 28,30 ****
--- 28,35 ----
  $+tabe E16: Invalid range
  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
*** ../vim-7.4.565/src/version.c        2015-01-07 15:57:13.149559746 +0100
--- src/version.c       2015-01-07 16:50:24.620511525 +0100
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     566,
  /**/

-- 
ERROR 047: Keyboard not found.  Press RETURN to continue.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui