changeset 6641:ceda6d8af447 v7.4.646

updated for version 7.4.646 Problem: ":bufdo" may start at a deleted buffer. Solution: Find the first not deleted buffer. (Shane Harper)
author Bram Moolenaar <bram@vim.org>
date Fri, 27 Feb 2015 20:33:37 +0100
parents d8e66aa8dec7
children 3fa148f39809
files src/ex_cmds2.c src/testdir/test_command_count.in src/testdir/test_command_count.ok src/version.c
diffstat 4 files changed, 18 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -2440,7 +2440,7 @@ ex_listdo(eap)
     win_T	*wp;
     tabpage_T	*tp;
 #endif
-    buf_T	*buf;
+    buf_T	*buf = curbuf;
     int		next_fnum = 0;
 #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
     char_u	*save_ei = NULL;
@@ -2493,20 +2493,28 @@ ex_listdo(eap)
 	    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);
+        {
+	    /* Advance to the first listed buffer after "eap->line1". */
+            for (buf = firstbuf; buf != NULL && (buf->b_fnum < eap->line1
+					  || !buf->b_p_bl); buf = buf->b_next)
+		if (buf->b_fnum > eap->line2)
+		{
+		    buf = NULL;
+		    break;
+		}
+            if (buf != NULL)
+		goto_buffer(eap, DOBUF_FIRST, FORWARD, buf->b_fnum);
+        }
 	else
 	    setpcmark();
 	listcmd_busy = TRUE;	    /* avoids setting pcmark below */
 
-	while (!got_int)
+	while (!got_int && buf != NULL)
 	{
 	    if (eap->cmdidx == CMD_argdo)
 	    {
--- a/src/testdir/test_command_count.in
+++ b/src/testdir/test_command_count.in
@@ -141,6 +141,7 @@ STARTTEST
 :let buffers = ''
 :.,$-bufdo let buffers .= ' '.bufnr('%')
 :call add(g:lines, 'bufdo:' . buffers)
+:3bd
 :let buffers = ''
 :3,7bufdo let buffers .= ' '.bufnr('%')
 :call add(g:lines, 'bufdo:' . buffers)
--- a/src/testdir/test_command_count.ok
+++ b/src/testdir/test_command_count.ok
@@ -34,5 +34,5 @@ aaa: 0 bbb: 0 ccc: 0
 argdo: c d e
 windo: 2 3 4
 bufdo: 2 3 4 5 6 7 8 9 10 15
-bufdo: 3 4 5 6 7
+bufdo: 4 5 6 7
 tabdo: 2 3 4
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    646,
+/**/
     645,
 /**/
     644,