summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-09-29 22:47:03 +0200
committerBram Moolenaar <Bram@vim.org>2020-09-29 22:47:03 +0200
commit8ec92c977976d9e9225183e36a80e6b0cdbf1f51 (patch)
treefff0d1e92c0e148aee452e08f34fd4a6247598ba
parent32fbc4f247a31e35ade0939542e11aa033a2554f (diff)
patch 8.2.1775: MS-Windows: adding a long quickfix list is slowv8.2.1775
Problem: MS-Windows: adding a long quickfix list is slow. Solution: Shorten the buffer name only for the first entry. (Yegappan Lakshmanan, closes #7039, closes #7033)
-rw-r--r--src/quickfix.c14
-rw-r--r--src/testdir/test_quickfix.vim12
-rw-r--r--src/version.c2
3 files changed, 24 insertions, 4 deletions
diff --git a/src/quickfix.c b/src/quickfix.c
index 43d2d3fbd5..d50cd16a1f 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -4496,6 +4496,7 @@ qf_buf_add_line(
linenr_T lnum,
qfline_T *qfp,
char_u *dirname,
+ int first_bufline,
char_u *qftf_str)
{
int len;
@@ -4520,9 +4521,11 @@ qf_buf_add_line(
vim_strncpy(IObuff, gettail(errbuf->b_fname), IOSIZE - 1);
else
{
- // shorten the file name if not done already
- if (errbuf->b_sfname == NULL
- || mch_isFullName(errbuf->b_sfname))
+ // Shorten the file name if not done already.
+ // For optimization, do this only for the first entry in a
+ // buffer.
+ if (first_bufline && (errbuf->b_sfname == NULL
+ || mch_isFullName(errbuf->b_sfname)))
{
if (*dirname == NUL)
mch_dirname(dirname, MAXPATHL);
@@ -4663,6 +4666,7 @@ qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last, int qf_winid)
{
char_u dirname[MAXPATHL];
int invalid_val = FALSE;
+ int prev_bufnr = -1;
*dirname = NUL;
@@ -4697,9 +4701,11 @@ qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last, int qf_winid)
invalid_val = TRUE;
}
- if (qf_buf_add_line(buf, lnum, qfp, dirname, qftf_str) == FAIL)
+ if (qf_buf_add_line(buf, lnum, qfp, dirname,
+ prev_bufnr != qfp->qf_fnum, qftf_str) == FAIL)
break;
+ prev_bufnr = qfp->qf_fnum;
++lnum;
qfp = qfp->qf_next;
if (qfp == NULL)
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 0d8e35538b..332831aa4a 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -3996,6 +3996,18 @@ func Test_shorten_fname()
" Displaying the quickfix list should simplify the file path
silent! clist
call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
+ " Add a few entries for the same file with different paths and check whether
+ " the buffer name is shortened
+ %bwipe
+ call setqflist([], 'f')
+ call setqflist([{'filename' : 'test_quickfix.vim', 'lnum' : 10},
+ \ {'filename' : '../testdir/test_quickfix.vim', 'lnum' : 20},
+ \ {'filename' : fname, 'lnum' : 30}], ' ')
+ copen
+ call assert_equal(['test_quickfix.vim|10| ',
+ \ 'test_quickfix.vim|20| ',
+ \ 'test_quickfix.vim|30| '], getline(1, '$'))
+ cclose
endfunc
" Quickfix title tests
diff --git a/src/version.c b/src/version.c
index 550296687d..26285fbc45 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1775,
+/**/
1774,
/**/
1773,