To: vim-dev@vim.org Subject: patch 7.0.191 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///