updated for version 7.0052
diff --git a/src/quickfix.c b/src/quickfix.c
index 079e6c9..38f7d95 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -35,7 +35,7 @@
int qf_col; /* column where the error occurred */
int qf_nr; /* error number */
char_u *qf_text; /* description of the error */
- char_u qf_virt_col; /* set to TRUE if qf_col is screen column */
+ char_u qf_viscol; /* set to TRUE if qf_col is screen column */
char_u qf_cleared;/* set to TRUE if line has been deleted */
char_u qf_type; /* type of the error (mostly 'E'); 1 for
:helpgrep */
@@ -88,7 +88,7 @@
static int qf_init_ext __ARGS((char_u *efile, buf_T *buf, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast));
static void qf_new_list __ARGS((void));
-static int qf_add_entry __ARGS((struct qf_line **prevp, char_u *dir, char_u *fname, char_u *mesg, long lnum, int col, int virt_col, int nr, int type, int valid));
+static int qf_add_entry __ARGS((struct qf_line **prevp, char_u *dir, char_u *fname, char_u *mesg, long lnum, int col, int vis_col, int nr, int type, int valid));
static void qf_msg __ARGS((void));
static void qf_free __ARGS((int idx));
static char_u *qf_types __ARGS((int, int));
@@ -147,7 +147,7 @@
char_u *errmsg;
char_u *fmtstr = NULL;
int col = 0;
- char_u use_virt_col = FALSE;
+ char_u use_viscol = FALSE;
int type = 0;
int valid;
linenr_T buflnum = lnumfirst;
@@ -467,7 +467,7 @@
errmsg[0] = NUL;
lnum = 0;
col = 0;
- use_virt_col = FALSE;
+ use_viscol = FALSE;
enr = -1;
type = 0;
tail = NULL;
@@ -515,12 +515,12 @@
{
col = (int)(regmatch.endp[i] - regmatch.startp[i] + 1);
if (*((char_u *)regmatch.startp[i]) != TAB)
- use_virt_col = TRUE;
+ use_viscol = TRUE;
}
if ((i = (int)fmt_ptr->addr[8]) > 0) /* %v */
{
col = (int)atol((char *)regmatch.startp[i]);
- use_virt_col = TRUE;
+ use_viscol = TRUE;
}
break;
}
@@ -578,7 +578,7 @@
qfprev->qf_lnum = lnum;
if (!qfprev->qf_col)
qfprev->qf_col = col;
- qfprev->qf_virt_col = use_virt_col;
+ qfprev->qf_viscol = use_viscol;
if (!qfprev->qf_fnum)
qfprev->qf_fnum = qf_get_fnum(directory,
*namebuf || directory ? namebuf
@@ -623,7 +623,7 @@
errmsg,
lnum,
col,
- use_virt_col,
+ use_viscol,
enr,
type,
valid) == FAIL)
@@ -714,14 +714,14 @@
* Returns OK or FAIL.
*/
static int
-qf_add_entry(prevp, dir, fname, mesg, lnum, col, virt_col, nr, type, valid)
+qf_add_entry(prevp, dir, fname, mesg, lnum, col, vis_col, nr, type, valid)
struct qf_line **prevp; /* pointer to previously added entry or NULL */
char_u *dir; /* optional directory name */
char_u *fname; /* file name or NULL */
char_u *mesg; /* message */
long lnum; /* line number */
int col; /* column */
- int virt_col; /* using virtual column */
+ int vis_col; /* using visual column */
int nr; /* error number */
int type; /* type character */
int valid; /* valid entry */
@@ -739,7 +739,7 @@
}
qfp->qf_lnum = lnum;
qfp->qf_col = col;
- qfp->qf_virt_col = virt_col;
+ qfp->qf_viscol = vis_col;
qfp->qf_nr = nr;
if (type != 1 && !vim_isprintc(type)) /* only printable chars allowed */
type = 0;
@@ -1285,7 +1285,7 @@
if (qf_ptr->qf_col > 0)
{
curwin->w_cursor.col = qf_ptr->qf_col - 1;
- if (qf_ptr->qf_virt_col == TRUE)
+ if (qf_ptr->qf_viscol == TRUE)
{
/*
* Check each character from the beginning of the error
@@ -2300,6 +2300,8 @@
#endif
#ifdef FEAT_AUTOCMD
char_u *au_name = NULL;
+ int flags = 0;
+ colnr_T col;
switch (eap->cmdidx)
{
@@ -2318,14 +2320,12 @@
/* Get the search pattern: either white-separated or enclosed in // */
regmatch.regprog = NULL;
- p = skip_vimgrep_pat(eap->arg, &s);
+ p = skip_vimgrep_pat(eap->arg, &s, &flags);
if (p == NULL)
{
EMSG(_("E682: Invalid search pattern or delimiter"));
goto theend;
}
- if (*p != NUL)
- *p++ = NUL;
regmatch.regprog = vim_regcomp(s, RE_MAGIC);
if (regmatch.regprog == NULL)
goto theend;
@@ -2437,10 +2437,13 @@
goto jumpend;
}
#endif
+ /* Try for a match in all lines of the buffer. */
for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
{
- if (vim_regexec_multi(®match, curwin, buf, lnum,
- (colnr_T)0) > 0)
+ /* For ":1vimgrep" look for multiple matches. */
+ col = 0;
+ while (vim_regexec_multi(®match, curwin, buf, lnum,
+ col) > 0)
{
if (qf_add_entry(&prevp,
NULL, /* dir */
@@ -2449,7 +2452,7 @@
regmatch.startpos[0].lnum + lnum, FALSE),
regmatch.startpos[0].lnum + lnum,
regmatch.startpos[0].col + 1,
- FALSE, /* virt_col */
+ FALSE, /* vis_col */
0, /* nr */
0, /* type */
TRUE /* valid */
@@ -2460,6 +2463,13 @@
}
else
found_match = TRUE;
+ if ((flags & VGR_GLOBAL) == 0
+ || regmatch.endpos[0].lnum > 0)
+ break;
+ col = regmatch.endpos[0].col
+ + (col == regmatch.endpos[0].col);
+ if (col > STRLEN(ml_get_buf(buf, lnum, FALSE)))
+ break;
}
line_breakcheck();
if (got_int)
@@ -2485,14 +2495,14 @@
{
/* When not hiding the buffer and no match was found we
* don't need to remember the buffer, wipe it out. If
- * there was a match and it wasn't the first one: only
- * unload the buffer. */
+ * there was a match and it wasn't the first one or we
+ * won't jump there: only unload the buffer. */
if (!found_match)
{
wipe_dummy_buffer(buf);
buf = NULL;
}
- else if (buf != first_match_buf)
+ else if (buf != first_match_buf || (flags & VGR_NOJUMP))
{
unload_dummy_buffer(buf);
buf = NULL;
@@ -2528,7 +2538,10 @@
/* Jump to first match. */
if (qf_lists[qf_curlist].qf_count > 0)
- qf_jump(0, 0, FALSE);
+ {
+ if ((flags & VGR_NOJUMP) == 0)
+ qf_jump(0, 0, eap->forceit);
+ }
else
EMSG2(_(e_nomatch2), s);
@@ -2543,29 +2556,57 @@
}
/*
- * Skip over the pattern argument of ":vimgrep /pat/".
+ * Skip over the pattern argument of ":vimgrep /pat/[g][j]".
* Put the start of the pattern in "*s", unless "s" is NULL.
- * Return a pointer to the char just past the pattern.
+ * If "flags" is not NULL put the flags in it: VGR_GLOBAL, VGR_NOJUMP.
+ * If "s" is not NULL terminate the pattern with a NUL.
+ * Return a pointer to the char just past the pattern plus flags.
*/
char_u *
-skip_vimgrep_pat(p, s)
- char_u *p;
- char_u **s;
+skip_vimgrep_pat(p, s, flags)
+ char_u *p;
+ char_u **s;
+ int *flags;
{
int c;
if (vim_isIDc(*p))
{
+ /* ":vimgrep pattern fname" */
if (s != NULL)
*s = p;
- return skiptowhite(p);
+ p = skiptowhite(p);
+ if (s != NULL && *p != NUL)
+ *p++ = NUL;
}
- if (s != NULL)
- *s = p + 1;
- c = *p;
- p = skip_regexp(p + 1, c, TRUE, NULL);
- if (*p != c)
- return NULL;
+ else
+ {
+ /* ":vimgrep /pattern/[g][j] fname" */
+ if (s != NULL)
+ *s = p + 1;
+ c = *p;
+ p = skip_regexp(p + 1, c, TRUE, NULL);
+ if (*p != c)
+ return NULL;
+
+ /* Truncate the pattern. */
+ if (s != NULL)
+ *p = NUL;
+ ++p;
+
+ /* Find the flags */
+ while (*p == 'g' || *p == 'j')
+ {
+ if (flags != NULL)
+ {
+ if (*p == 'g')
+ *flags |= VGR_GLOBAL;
+ else
+ *flags |= VGR_NOJUMP;
+ }
+ ++p;
+ }
+ }
return p;
}
@@ -2667,6 +2708,51 @@
close_buffer(NULL, buf, DOBUF_UNLOAD);
}
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Add each quickfix error to list "list" as a dictionary.
+ */
+ int
+get_errorlist(list)
+ list_T *list;
+{
+ dict_T *dict;
+ char_u buf[2];
+ struct qf_line *qfp;
+ int i;
+
+ if (qf_curlist >= qf_listcount || qf_lists[qf_curlist].qf_count == 0)
+ {
+ EMSG(_(e_quickfix));
+ return FAIL;
+ }
+
+ qfp = qf_lists[qf_curlist].qf_start;
+ for (i = 1; !got_int && i <= qf_lists[qf_curlist].qf_count; ++i)
+ {
+ if ((dict = dict_alloc()) == NULL)
+ return FAIL;
+ if (list_append_dict(list, dict) == FAIL)
+ return FAIL;
+
+ buf[0] = qfp->qf_type;
+ buf[1] = NUL;
+ if ( dict_add_nr_str(dict, "bufnr", (long)qfp->qf_fnum, 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
+ || dict_add_nr_str(dict, "nr", (long)qfp->qf_nr, NULL) == FAIL
+ || dict_add_nr_str(dict, "text", 0L, qfp->qf_text) == FAIL
+ || dict_add_nr_str(dict, "type", 0L, buf) == FAIL
+ || dict_add_nr_str(dict, "valid", (long)qfp->qf_valid, NULL) == FAIL)
+ return FAIL;
+
+ qfp = qfp->qf_next;
+ }
+ return OK;
+}
+#endif
+
/*
* ":[range]cbuffer [bufnr]" command.
*/
@@ -2781,7 +2867,7 @@
lnum,
(int)(regmatch.startp[0] - IObuff)
+ 1, /* col */
- FALSE, /* virt_col */
+ FALSE, /* vis_col */
0, /* nr */
1, /* type */
TRUE /* valid */