vcol non-zero: "col" is visual column
zero: "col" is byte index
nr error number
+ pattern search pattern used to locate the error
text description of the error
type type of the error, 'E', '1', etc.
valid non-zero: recognized error message
When there is no error list or it's empty an empty list is
- returned.
+ returned. Quickfix list entries with non-existing buffer
+ number are returned with "bufnr" set to zero.
Useful application: Find pattern matches in multiple files and
do something with them: >
Non-dictionary items in {list} are ignored. Each dictionary
item can contain the following entries:
- filename name of a file
+ bufnr buffer number; must be the number of a valid
+ buffer
+ filename name of a file; only used when "bufnr" is not
+ present or it is invalid.
lnum line number in the file
pattern search pattern used to locate the error
col column number
The "col", "vcol", "nr", "type" and "text" entries are
optional. Either "lnum" or "pattern" entry can be used to
locate a matching error line.
- If the "filename" entry is not present or neither the "lnum"
- or "pattern" entries are present, then the item will not be
- handled as an error line.
+ If the "filename" and "bufnr" entries are not present or
+ neither the "lnum" or "pattern" entries are present, then the
+ item will not be handled as an error line.
If both "pattern" and "lnum" are present then "pattern" will
be used.
+ Note that the list is not exactly the same as what
+ |getqflist()| returns.
If {action} is set to 'a', then the items from {list} are
added to the existing quickfix list. If there is no existing
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));
(*namebuf || directory)
? namebuf
: ((currfile && valid) ? currfile : (char_u *)NULL),
+ 0,
errmsg,
lnum,
col,
* 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 */
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);
if (qf_add_entry(to->w_llist, &prevp,
NULL,
NULL,
+ 0,
from_qfp->qf_text,
from_qfp->qf_lnum,
from_qfp->qf_col,
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,
char_u buf[2];
qfline_T *qfp;
int i;
+ int bufnum;
if (wp != NULL)
{
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)
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
listitem_T *li;
dict_T *d;
char_u *filename, *pattern, *text, *type;
+ int bufnum;
long lnum;
int col, nr;
int vcol;
int valid, status;
int retval = OK;
qf_info_T *qi = &ql_info;
+ int did_bufnr_emsg = FALSE;
if (wp != NULL)
{
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");
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,
if (qf_add_entry(qi, &prevp,
NULL, /* dir */
fnames[fi],
+ 0,
IObuff,
lnum,
(int)(regmatch.startp[0] - IObuff)