diff options
author | Bram Moolenaar <Bram@vim.org> | 2015-02-27 20:33:37 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2015-02-27 20:33:37 +0100 |
commit | e25bb90b2eb0ceed2caa5202ca62003e367021ae (patch) | |
tree | 9f1b2ea8bfd1ba156af43f09fc33cd2c571e387c /src/ex_cmds2.c | |
parent | 8da9bbfd02957b79edd595c8c7397453012510b0 (diff) | |
download | vim-e25bb90b2eb0ceed2caa5202ca62003e367021ae.zip |
updated for version 7.4.646
Problem: ":bufdo" may start at a deleted buffer.
Solution: Find the first not deleted buffer. (Shane Harper)
Diffstat (limited to 'src/ex_cmds2.c')
-rw-r--r-- | src/ex_cmds2.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 48badeb93..2cd762692 100644 --- 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) { |