changeset 22454:849c6f766b19 v8.2.1775

patch 8.2.1775: MS-Windows: adding a long quickfix list is slow Commit: https://github.com/vim/vim/commit/8ec92c977976d9e9225183e36a80e6b0cdbf1f51 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Sep 29 22:47:03 2020 +0200 patch 8.2.1775: MS-Windows: adding a long quickfix list is slow 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)
author Bram Moolenaar <Bram@vim.org>
date Tue, 29 Sep 2020 23:00:04 +0200
parents a6725092ab5f
children 8eb75f07f1e0
files src/quickfix.c src/testdir/test_quickfix.vim src/version.c
diffstat 3 files changed, 24 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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 *bu
     {
 	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 *bu
 		    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)
--- 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
--- 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,