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    ///

Reply via email to