# HG changeset patch # User Bram Moolenaar # Date 1601413204 -7200 # Node ID 849c6f766b198043f02679a871707cb8d658a463 # Parent a6725092ab5faf4ffab7c9a33fd5bc52c0e0d8a4 patch 8.2.1775: MS-Windows: adding a long quickfix list is slow Commit: https://github.com/vim/vim/commit/8ec92c977976d9e9225183e36a80e6b0cdbf1f51 Author: Bram Moolenaar 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) diff --git a/src/quickfix.c b/src/quickfix.c --- 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) diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim --- 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 --- 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,