Patch 7.4.2017
Problem: When there are many errors adding them to the quickfix list takes
a long time.
Solution: Add BLN_NOOPT. Don't call buf_valid() in buf_copy_options().
Remember the last file name used. When going through the buffer
list start from the end of the list. Only call buf_valid() when
autocommands were executed.
Files: src/buffer.c, src/option.c, src/quickfix.c, src/vim.h
*** ../vim-7.4.2016/src/buffer.c 2016-07-09 23:40:29.831039214 +0200
--- src/buffer.c 2016-07-10 16:43:48.432580746 +0200
***************
*** 316,322 ****
{
buf_T *bp;
! for (bp = firstbuf; bp != NULL; bp = bp->b_next)
if (bp == buf)
return TRUE;
return FALSE;
--- 316,324 ----
{
buf_T *bp;
! /* Assume that we more often have a recent buffer, start with the last
! * one. */
! for (bp = lastbuf; bp != NULL; bp = bp->b_prev)
if (bp == buf)
return TRUE;
return FALSE;
***************
*** 397,405 ****
if (buf->b_nwindows == 1)
{
buf->b_closing = TRUE;
! apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname,
! FALSE, buf);
! if (!buf_valid(buf))
{
/* Autocommands deleted the buffer. */
aucmd_abort:
--- 399,407 ----
if (buf->b_nwindows == 1)
{
buf->b_closing = TRUE;
! if (apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname,
! FALSE, buf)
! && !buf_valid(buf))
{
/* Autocommands deleted the buffer. */
aucmd_abort:
***************
*** 416,424 ****
if (!unload_buf)
{
buf->b_closing = TRUE;
! apply_autocmds(EVENT_BUFHIDDEN, buf->b_fname, buf->b_fname,
! FALSE, buf);
! if (!buf_valid(buf))
/* Autocommands deleted the buffer. */
goto aucmd_abort;
buf->b_closing = FALSE;
--- 418,426 ----
if (!unload_buf)
{
buf->b_closing = TRUE;
! if (apply_autocmds(EVENT_BUFHIDDEN, buf->b_fname, buf->b_fname,
! FALSE, buf)
! && !buf_valid(buf))
/* Autocommands deleted the buffer. */
goto aucmd_abort;
buf->b_closing = FALSE;
***************
*** 577,597 ****
buf->b_closing = TRUE;
if (buf->b_ml.ml_mfp != NULL)
{
! apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf);
! if (!buf_valid(buf)) /* autocommands may delete the buffer */
return;
}
if ((flags & BFA_DEL) && buf->b_p_bl)
{
! apply_autocmds(EVENT_BUFDELETE, buf->b_fname, buf->b_fname, FALSE, buf);
! if (!buf_valid(buf)) /* autocommands may delete the buffer */
return;
}
if (flags & BFA_WIPE)
{
! apply_autocmds(EVENT_BUFWIPEOUT, buf->b_fname, buf->b_fname,
! FALSE, buf);
! if (!buf_valid(buf)) /* autocommands may delete the buffer */
return;
}
buf->b_closing = FALSE;
--- 579,601 ----
buf->b_closing = TRUE;
if (buf->b_ml.ml_mfp != NULL)
{
! if (apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname,
! FALSE, buf)
! && !buf_valid(buf)) /* autocommands may delete the buffer */
return;
}
if ((flags & BFA_DEL) && buf->b_p_bl)
{
! if (apply_autocmds(EVENT_BUFDELETE, buf->b_fname, buf->b_fname,
! FALSE, buf)
! && !buf_valid(buf)) /* autocommands may delete the buffer */
return;
}
if (flags & BFA_WIPE)
{
! if (apply_autocmds(EVENT_BUFWIPEOUT, buf->b_fname, buf->b_fname,
! FALSE, buf)
! && !buf_valid(buf)) /* autocommands may delete the buffer */
return;
}
buf->b_closing = FALSE;
***************
*** 1452,1462 ****
prevbuf = curbuf;
#ifdef FEAT_AUTOCMD
! apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf);
# ifdef FEAT_EVAL
! if (buf_valid(prevbuf) && !aborting())
# else
! if (buf_valid(prevbuf))
# endif
#endif
{
--- 1456,1466 ----
prevbuf = curbuf;
#ifdef FEAT_AUTOCMD
! if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf)
# ifdef FEAT_EVAL
! || (buf_valid(prevbuf) && !aborting()))
# else
! || buf_valid(prevbuf))
# endif
#endif
{
***************
*** 1654,1659 ****
--- 1658,1665 ----
* If (flags & BLN_LISTED) is TRUE, add new buffer to buffer list.
* If (flags & BLN_DUMMY) is TRUE, don't count it as a real buffer.
* If (flags & BLN_NEW) is TRUE, don't use an existing buffer.
+ * If (flags & BLN_NOOPT) is TRUE, don't copy options from the current buffer
+ * if the buffer already exists.
* This is the ONLY way to create a new buffer.
*/
static int top_file_num = 1; /* highest file number */
***************
*** 1692,1708 ****
vim_free(ffname);
if (lnum != 0)
buflist_setfpos(buf, curwin, lnum, (colnr_T)0, FALSE);
! /* copy the options now, if 'cpo' doesn't have 's' and not done
! * already */
! buf_copy_options(buf, 0);
if ((flags & BLN_LISTED) && !buf->b_p_bl)
{
buf->b_p_bl = TRUE;
#ifdef FEAT_AUTOCMD
if (!(flags & BLN_DUMMY))
{
! apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, buf);
! if (!buf_valid(buf))
return NULL;
}
#endif
--- 1698,1717 ----
vim_free(ffname);
if (lnum != 0)
buflist_setfpos(buf, curwin, lnum, (colnr_T)0, FALSE);
!
! if ((flags & BLN_NOOPT) == 0)
! /* copy the options now, if 'cpo' doesn't have 's' and not done
! * already */
! buf_copy_options(buf, 0);
!
if ((flags & BLN_LISTED) && !buf->b_p_bl)
{
buf->b_p_bl = TRUE;
#ifdef FEAT_AUTOCMD
if (!(flags & BLN_DUMMY))
{
! if (apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, buf)
! && !buf_valid(buf))
return NULL;
}
#endif
***************
*** 1881,1893 ****
/* Tricky: these autocommands may change the buffer list. They could
* also split the window with re-using the one empty buffer. This may
* result in unexpectedly losing the empty buffer. */
! apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, buf);
! if (!buf_valid(buf))
return NULL;
if (flags & BLN_LISTED)
{
! apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, buf);
! if (!buf_valid(buf))
return NULL;
}
# ifdef FEAT_EVAL
--- 1890,1902 ----
/* Tricky: these autocommands may change the buffer list. They could
* also split the window with re-using the one empty buffer. This may
* result in unexpectedly losing the empty buffer. */
! if (apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, buf)
! && !buf_valid(buf))
return NULL;
if (flags & BLN_LISTED)
{
! if (apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, buf)
! && !buf_valid(buf))
return NULL;
}
# ifdef FEAT_EVAL
*** ../vim-7.4.2016/src/option.c 2016-07-01 23:13:57.380275358 +0200
--- src/option.c 2016-07-10 15:43:51.759068244 +0200
***************
*** 10635,10646 ****
int did_isk = FALSE;
/*
- * Don't do anything if the buffer is invalid.
- */
- if (buf == NULL || !buf_valid(buf))
- return;
-
- /*
* Skip this when the option defaults have not been set yet. Happens when
* main() allocates the first buffer.
*/
--- 10635,10640 ----
*** ../vim-7.4.2016/src/quickfix.c 2016-07-09 17:55:24.902980302 +0200
--- src/quickfix.c 2016-07-10 16:45:08.119385640 +0200
***************
*** 1483,1496 ****
}
/*
* Get buffer number for file "dir.name".
* Also sets the b_has_qf_entry flag.
*/
static int
qf_get_fnum(qf_info_T *qi, char_u *directory, char_u *fname)
{
! char_u *ptr;
buf_T *buf;
if (fname == NULL || *fname == NUL) /* no file name */
return 0;
--- 1483,1504 ----
}
/*
+ * Looking up a buffer can be slow if there are many. Remember the last one
+ * to make this a lot faster if there are multiple matches in the same file.
+ */
+ static char_u *qf_last_bufname = NULL;
+ static buf_T *qf_last_buf = NULL;
+
+ /*
* Get buffer number for file "dir.name".
* Also sets the b_has_qf_entry flag.
*/
static int
qf_get_fnum(qf_info_T *qi, char_u *directory, char_u *fname)
{
! char_u *ptr = NULL;
buf_T *buf;
+ char_u *bufname;
if (fname == NULL || *fname == NUL) /* no file name */
return 0;
***************
*** 1522,1534 ****
ptr = vim_strsave(fname);
}
/* Use concatenated directory name and file name */
! buf = buflist_new(ptr, NULL, (linenr_T)0, 0);
vim_free(ptr);
}
else
! buf = buflist_new(fname, NULL, (linenr_T)0, 0);
if (buf == NULL)
return 0;
buf->b_has_qf_entry = TRUE;
return buf->b_fnum;
}
--- 1530,1559 ----
ptr = vim_strsave(fname);
}
/* Use concatenated directory name and file name */
! bufname = ptr;
! }
! else
! bufname = fname;
!
! if (qf_last_bufname != NULL && STRCMP(bufname, qf_last_bufname) == 0
! && buf_valid(qf_last_buf))
! {
! buf = qf_last_buf;
vim_free(ptr);
}
else
! {
! vim_free(qf_last_bufname);
! buf = buflist_new(bufname, NULL, (linenr_T)0, BLN_NOOPT);
! if (bufname == ptr)
! qf_last_bufname = bufname;
! else
! qf_last_bufname = vim_strsave(bufname);
! qf_last_buf = buf;
! }
if (buf == NULL)
return 0;
+
buf->b_has_qf_entry = TRUE;
return buf->b_fnum;
}
*** ../vim-7.4.2016/src/vim.h 2016-07-01 17:17:13.298266645 +0200
--- src/vim.h 2016-07-10 15:41:41.337027713 +0200
***************
*** 941,946 ****
--- 941,947 ----
#define BLN_LISTED 2 /* put new buffer in buffer list */
#define BLN_DUMMY 4 /* allocating dummy buffer */
#define BLN_NEW 8 /* create a new buffer */
+ #define BLN_NOOPT 16 /* don't copy options to existing buffer */
/* Values for in_cinkeys() */
#define KEY_OPEN_FORW 0x101
*** ../vim-7.4.2016/src/version.c 2016-07-10 13:57:35.889542273 +0200
--- src/version.c 2016-07-10 16:08:56.172214520 +0200
***************
*** 760,761 ****
--- 760,763 ----
{ /* Add new patch number below this line */
+ /**/
+ 2017,
/**/
--
hundred-and-one symptoms of being an internet addict:
263. You have more e-mail addresses than shorts.
/// 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.