diff options
author | Bram Moolenaar <Bram@vim.org> | 2007-02-04 01:58:18 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2007-02-04 01:58:18 +0000 |
commit | 48b66fb5a7197c79c05de133dddc8563cc942d9b (patch) | |
tree | bdb029523ae3cc017db31b6821ec42236145ee12 /src/quickfix.c | |
parent | 86ea76404e0f1d41aa14dd7b4302bed4f503ef58 (diff) | |
download | vim-git-48b66fb5a7197c79c05de133dddc8563cc942d9b.tar.gz |
updated for version 7.0-191v7.0.191
Diffstat (limited to 'src/quickfix.c')
-rw-r--r-- | src/quickfix.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/src/quickfix.c b/src/quickfix.c index 6268ec66f..3b4713239 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -106,7 +106,7 @@ struct efm_S static int qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast)); static void qf_new_list __ARGS((qf_info_T *qi)); -static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid)); +static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid)); static void qf_msg __ARGS((qf_info_T *qi)); static void qf_free __ARGS((qf_info_T *qi, int idx)); static char_u *qf_types __ARGS((int, int)); @@ -791,6 +791,7 @@ restofline: (*namebuf || directory) ? namebuf : ((currfile && valid) ? currfile : (char_u *)NULL), + 0, errmsg, lnum, col, @@ -936,12 +937,13 @@ qf_free_all(wp) * Returns OK or FAIL. */ static int -qf_add_entry(qi, prevp, dir, fname, mesg, lnum, col, vis_col, pattern, nr, type, - valid) +qf_add_entry(qi, prevp, dir, fname, bufnum, mesg, lnum, col, vis_col, pattern, + nr, type, valid) qf_info_T *qi; /* quickfix list */ qfline_T **prevp; /* pointer to previously added entry or NULL */ char_u *dir; /* optional directory name */ char_u *fname; /* file name or NULL */ + int bufnum; /* buffer number or zero */ char_u *mesg; /* message */ long lnum; /* line number */ int col; /* column */ @@ -955,7 +957,10 @@ qf_add_entry(qi, prevp, dir, fname, mesg, lnum, col, vis_col, pattern, nr, type, if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL) return FAIL; - qfp->qf_fnum = qf_get_fnum(dir, fname); + if (bufnum != 0) + qfp->qf_fnum = bufnum; + else + qfp->qf_fnum = qf_get_fnum(dir, fname); if ((qfp->qf_text = vim_strsave(mesg)) == NULL) { vim_free(qfp); @@ -1106,6 +1111,7 @@ copy_loclist(from, to) if (qf_add_entry(to->w_llist, &prevp, NULL, NULL, + 0, from_qfp->qf_text, from_qfp->qf_lnum, from_qfp->qf_col, @@ -3134,6 +3140,7 @@ ex_vimgrep(eap) if (qf_add_entry(qi, &prevp, NULL, /* dir */ fnames[fi], + 0, ml_get_buf(buf, regmatch.startpos[0].lnum + lnum, FALSE), regmatch.startpos[0].lnum + lnum, @@ -3419,6 +3426,7 @@ get_errorlist(wp, list) char_u buf[2]; qfline_T *qfp; int i; + int bufnum; if (wp != NULL) { @@ -3434,6 +3442,11 @@ get_errorlist(wp, list) qfp = qi->qf_lists[qi->qf_curlist].qf_start; for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ++i) { + /* Handle entries with a non-existing buffer number. */ + bufnum = qfp->qf_fnum; + if (bufnum != 0 && (buflist_findnr(bufnum) == NULL)) + bufnum = 0; + if ((dict = dict_alloc()) == NULL) return FAIL; if (list_append_dict(list, dict) == FAIL) @@ -3441,7 +3454,7 @@ get_errorlist(wp, list) buf[0] = qfp->qf_type; buf[1] = NUL; - if ( dict_add_nr_str(dict, "bufnr", (long)qfp->qf_fnum, NULL) == FAIL + if ( dict_add_nr_str(dict, "bufnr", (long)bufnum, NULL) == FAIL || dict_add_nr_str(dict, "lnum", (long)qfp->qf_lnum, NULL) == FAIL || dict_add_nr_str(dict, "col", (long)qfp->qf_col, NULL) == FAIL || dict_add_nr_str(dict, "vcol", (long)qfp->qf_viscol, NULL) == FAIL @@ -3472,6 +3485,7 @@ set_errorlist(wp, list, action) listitem_T *li; dict_T *d; char_u *filename, *pattern, *text, *type; + int bufnum; long lnum; int col, nr; int vcol; @@ -3479,6 +3493,7 @@ set_errorlist(wp, list, action) int valid, status; int retval = OK; qf_info_T *qi = &ql_info; + int did_bufnr_emsg = FALSE; if (wp != NULL) { @@ -3508,6 +3523,7 @@ set_errorlist(wp, list, action) continue; filename = get_dict_string(d, (char_u *)"filename", TRUE); + bufnum = get_dict_number(d, (char_u *)"bufnr"); lnum = get_dict_number(d, (char_u *)"lnum"); col = get_dict_number(d, (char_u *)"col"); vcol = get_dict_number(d, (char_u *)"vcol"); @@ -3519,12 +3535,26 @@ set_errorlist(wp, list, action) text = vim_strsave((char_u *)""); valid = TRUE; - if (filename == NULL || (lnum == 0 && pattern == NULL)) + if ((filename == NULL && bufnum == 0) || (lnum == 0 && pattern == NULL)) valid = FALSE; + /* Mark entries with non-existing buffer number as not valid. Give the + * error message only once. */ + if (bufnum != 0 && (buflist_findnr(bufnum) == NULL)) + { + if (!did_bufnr_emsg) + { + did_bufnr_emsg = TRUE; + EMSGN(_("E92: Buffer %ld not found"), bufnum); + } + valid = FALSE; + bufnum = 0; + } + status = qf_add_entry(qi, &prevp, NULL, /* dir */ filename, + bufnum, text, lnum, col, @@ -3757,6 +3787,7 @@ ex_helpgrep(eap) if (qf_add_entry(qi, &prevp, NULL, /* dir */ fnames[fi], + 0, IObuff, lnum, (int)(regmatch.startp[0] - IObuff) |