aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/quickfix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/quickfix.c')
-rw-r--r--src/nvim/quickfix.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index cebff5e8b7..7b22c95967 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -1283,11 +1283,17 @@ void copy_loclist(win_T *from, win_T *to)
to->w_llist->qf_curlist = qi->qf_curlist; /* current list */
}
+// 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 "directory.fname".
// 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;
+ char_u *ptr = NULL;
+ char_u *bufname;
buf_T *buf;
if (fname == NULL || *fname == NUL) { // no file name
return 0;
@@ -1314,11 +1320,22 @@ static int qf_get_fnum(qf_info_T *qi, char_u *directory, char_u *fname)
ptr = vim_strsave(fname);
}
}
- // Use concatenated directory name and file name
- buf = buflist_new(ptr, NULL, (linenr_T)0, 0);
+ // 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;
xfree(ptr);
} else {
- buf = buflist_new(fname, NULL, (linenr_T)0, 0);
+ xfree(qf_last_bufname);
+ buf = buflist_new(bufname, NULL, (linenr_T)0, BLN_NOOPT);
+ qf_last_bufname = (bufname == ptr) ? bufname : vim_strsave(bufname);
+ qf_last_buf = buf;
}
if (buf == NULL) {
return 0;