Patch 7.0.191
Problem: The items used by getqflist() and setqflist() don't match.
Solution: Support the "bufnum" item for setqflist(). (Yegappan Lakshmanan)
Files: runtime/doc/eval.txt, src/quickfix.c
*** ../vim-7.0.190/runtime/doc/eval.txt Wed Nov 1 15:31:02 2006
--- runtime/doc/eval.txt Sun Feb 4 01:54:35 2007
***************
*** 2897,2908 ****
vcol non-zero: "col" is visual column
zero: "col" is byte index
nr error number
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.
Useful application: Find pattern matches in multiple files and
do something with them: >
--- 2912,2925 ----
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. 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: >
***************
*** 4371,4377 ****
Non-dictionary items in {list} are ignored. Each dictionary
item can contain the following entries:
! filename name of a file
lnum line number in the file
pattern search pattern used to locate the error
col column number
--- 4401,4410 ----
Non-dictionary items in {list} are ignored. Each dictionary
item can contain the following entries:
! 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
***************
*** 4384,4394 ****
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 both "pattern" and "lnum" are present then "pattern" will
be used.
If {action} is set to 'a', then the items from {list} are
added to the existing quickfix list. If there is no existing
--- 4417,4429 ----
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" 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
*** ../vim-7.0.190/src/quickfix.c Fri Oct 20 20:15:05 2006
--- src/quickfix.c Sun Feb 4 01:50:17 2007
***************
*** 106,112 ****
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 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));
--- 106,112 ----
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, 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,796 ****
--- 791,797 ----
(*namebuf || directory)
? namebuf
: ((currfile && valid) ? currfile : (char_u *)NULL),
+ 0,
errmsg,
lnum,
col,
***************
*** 936,947 ****
* Returns OK or FAIL.
*/
static int
! qf_add_entry(qi, prevp, dir, fname, 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 */
char_u *mesg; /* message */
long lnum; /* line number */
int col; /* column */
--- 937,949 ----
* Returns OK or FAIL.
*/
static int
! 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,961 ****
if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL)
return FAIL;
! qfp->qf_fnum = qf_get_fnum(dir, fname);
if ((qfp->qf_text = vim_strsave(mesg)) == NULL)
{
vim_free(qfp);
--- 957,966 ----
if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL)
return FAIL;
! 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,1111 ****
--- 1111,1117 ----
if (qf_add_entry(to->w_llist, &prevp,
NULL,
NULL,
+ 0,
from_qfp->qf_text,
from_qfp->qf_lnum,
from_qfp->qf_col,
***************
*** 3134,3139 ****
--- 3140,3146 ----
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,3424 ****
--- 3426,3432 ----
char_u buf[2];
qfline_T *qfp;
int i;
+ int bufnum;
if (wp != NULL)
{
***************
*** 3434,3439 ****
--- 3442,3452 ----
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,3447 ****
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
--- 3454,3460 ----
buf[0] = qfp->qf_type;
buf[1] = NUL;
! 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,3477 ****
--- 3485,3491 ----
listitem_T *li;
dict_T *d;
char_u *filename, *pattern, *text, *type;
+ int bufnum;
long lnum;
int col, nr;
int vcol;
***************
*** 3479,3484 ****
--- 3493,3499 ----
int valid, status;
int retval = OK;
qf_info_T *qi = &ql_info;
+ int did_bufnr_emsg = FALSE;
if (wp != NULL)
{
***************
*** 3508,3513 ****
--- 3523,3529 ----
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,3530 ****
text = vim_strsave((char_u *)"");
valid = TRUE;
! if (filename == NULL || (lnum == 0 && pattern == NULL))
valid = FALSE;
status = qf_add_entry(qi, &prevp,
NULL, /* dir */
filename,
text,
lnum,
col,
--- 3535,3560 ----
text = vim_strsave((char_u *)"");
valid = TRUE;
! 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,3762 ****
--- 3787,3793 ----
if (qf_add_entry(qi, &prevp,
NULL, /* dir */
fnames[fi],
+ 0,
IObuff,
lnum,
(int)(regmatch.startp[0] - IObuff)
*** ../vim-7.0.190/src/version.c Sun Feb 4 02:49:03 2007
--- src/version.c Sun Feb 4 02:50:49 2007
***************
*** 668,669 ****
--- 668,671 ----
{ /* Add new patch number below this line */
+ /**/
+ 191,
/**/
--
>From "know your smileys":
|-P Reaction to unusually ugly C code
/// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute -- http://www.A-A-P.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///