]> granicus.if.org Git - vim/commitdiff
patch 8.2.1775: MS-Windows: adding a long quickfix list is slow v8.2.1775
authorBram Moolenaar <Bram@vim.org>
Tue, 29 Sep 2020 20:47:03 +0000 (22:47 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 29 Sep 2020 20:47:03 +0000 (22:47 +0200)
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)

src/quickfix.c
src/testdir/test_quickfix.vim
src/version.c

index 43d2d3fbd5067a821368ad23861614a6ee3103aa..d50cd16a1f1b626310e98770d46112d7128d978c 100644 (file)
@@ -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)
index 0d8e35538b940177b245128f061d58baca74bce2..332831aa4add308c8a298d45a0e57f89c2a36e91 100644 (file)
@@ -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
index 550296687de2044e869da3457d2063ca8b815bcd..26285fbc451c6dcc8b7160dc98ee1ff669909897 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1775,
 /**/
     1774,
 /**/