]> granicus.if.org Git - vim/commitdiff
patch 7.4.2200 v7.4.2200
authorBram Moolenaar <Bram@vim.org>
Fri, 12 Aug 2016 14:29:27 +0000 (16:29 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 12 Aug 2016 14:29:27 +0000 (16:29 +0200)
Problem:    Cannot get all information about a quickfix list.
Solution:   Add an optional argument to get/set loc/qf list(). (Yegappan
            Lakshmanan)

runtime/doc/eval.txt
src/evalfunc.c
src/proto/quickfix.pro
src/quickfix.c
src/tag.c
src/testdir/test_quickfix.vim
src/version.c

index 39765d59e670b15ebc0652d7ce1fb917edaf9bc7..2e13c962e6b1f380e0973ee3c24debc671cfdff3 100644 (file)
@@ -1,4 +1,4 @@
-*eval.txt*     For Vim version 7.4.  Last change: 2016 Aug 07
+*eval.txt*     For Vim version 7.4.  Last change: 2016 Aug 12
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -207,7 +207,7 @@ this won't happen: >
        let otherDict.myFunction = myDict.myFunction
        call otherDict.myFunction()
 
-Here "self" will be "myDict", because it was bound explitly.
+Here "self" will be "myDict", because it was bound explicitly.
 
 
 1.3 Lists ~
@@ -1848,25 +1848,25 @@ v:swapcommand   Normal mode command to be executed after a file has been
                example, when jumping to a tag the value is ":tag tagname\r".
                For ":edit +cmd file" the value is ":cmd\r".
 
-                               *v:t_TYPE* *v:t_bool* *t_bool-varialble*
+                               *v:t_TYPE* *v:t_bool* *t_bool-variable*
 v:t_bool       Value of Boolean type.  Read-only.  See: |type()|
-                                       *v:t_channel* *t_channel-varialble*
+                                       *v:t_channel* *t_channel-variable*
 v:t_channel    Value of Channel type.  Read-only.  See: |type()|
-                                       *v:t_dict* *t_dict-varialble*
+                                       *v:t_dict* *t_dict-variable*
 v:t_dict       Value of Dictionary type.  Read-only.  See: |type()|
-                                       *v:t_float* *t_float-varialble*
+                                       *v:t_float* *t_float-variable*
 v:t_float      Value of Float type.  Read-only.  See: |type()|
-                                       *v:t_func* *t_func-varialble*
+                                       *v:t_func* *t_func-variable*
 v:t_func       Value of Funcref type.  Read-only.  See: |type()|
-                                       *v:t_job* *t_job-varialble*
+                                       *v:t_job* *t_job-variable*
 v:t_job                Value of Job type.  Read-only.  See: |type()|
-                                       *v:t_list* *t_list-varialble*
+                                       *v:t_list* *t_list-variable*
 v:t_list       Value of List type.  Read-only.  See: |type()|
-                                       *v:t_none* *t_none-varialble*
+                                       *v:t_none* *t_none-variable*
 v:t_none       Value of None type.  Read-only.  See: |type()|
-                                       *v:t_number* *t_number-varialble*
+                                       *v:t_number* *t_number-variable*
 v:t_number     Value of Number type.  Read-only.  See: |type()|
-                                       *v:t_string* *t_string-varialble*
+                                       *v:t_string* *t_string-variable*
 v:t_string     Value of String type.  Read-only.  See: |type()|
 
                                *v:termresponse* *termresponse-variable*
@@ -2102,11 +2102,11 @@ getftime({fname})               Number  last modification time of file
 getftype({fname})              String  description of type of file {fname}
 getline({lnum})                        String  line {lnum} of current buffer
 getline({lnum}, {end})         List    lines {lnum} to {end} of current buffer
-getloclist({nr})               List    list of location list items
+getloclist({nr}[, {what}])     List    list of location list items
 getmatches()                   List    list of current matches
 getpid()                       Number  process ID of Vim
 getpos({expr})                 List    position of cursor, mark, etc.
-getqflist()                    List    list of quickfix items
+getqflist([{what}])            List    list of quickfix items
 getreg([{regname} [, 1 [, {list}]]])
                                String or List   contents of register
 getregtype([{regname}])                String  type of register
@@ -2261,11 +2261,12 @@ setcharsearch({dict})           Dict    set character search from {dict}
 setcmdpos({pos})               Number  set cursor position in command-line
 setfperm({fname}, {mode})      Number  set {fname} file permissions to {mode}
 setline({lnum}, {line})                Number  set line {lnum} to {line}
-setloclist({nr}, {list}[, {action}])
+setloclist({nr}, {list}[, {action}[, {what}]])
                                Number  modify location list using {list}
 setmatches({list})             Number  restore a list of matches
 setpos({expr}, {list})         Number  set the {expr} position to {list}
-setqflist({list}[, {action}])  Number  modify quickfix list using {list}
+setqflist({list}[, {action}[, {what}]])
+                               Number  modify quickfix list using {list}
 setreg({n}, {v}[, {opt}])      Number  set register to value and type
 settabvar({nr}, {varname}, {val}) none set {varname} in tab page {nr} to {val}
 settabwinvar({tabnr}, {winnr}, {varname}, {val})
@@ -2860,8 +2861,8 @@ col({expr})       The result is a Number, which is the byte index of the column
 complete({startcol}, {matches})                        *complete()* *E785*
                Set the matches for Insert mode completion.
                Can only be used in Insert mode.  You need to use a mapping
-               with CTRL-R = |i_CTRL-R|.  It does not work after CTRL-O or
-               with an expression mapping.
+               with CTRL-R = (see |i_CTRL-R|).  It does not work after CTRL-O
+               or with an expression mapping.
                {startcol} is the byte offset in the line where the completed
                text start.  The text up to the cursor is the original text
                that will be replaced by the matches.  Use col('.') for an
@@ -4317,7 +4318,7 @@ getline({lnum} [, {end}])
 
 <              To get lines from another buffer see |getbufline()|
 
-getloclist({nr})                                       *getloclist()*
+getloclist({nr},[, {what}])                            *getloclist()*
                Returns a list with all the entries in the location list for
                window {nr}.  {nr} can be the window number or the window ID.
                When {nr} is zero the current window is used.
@@ -4326,6 +4327,10 @@ getloclist({nr})                                 *getloclist()*
                returned.  For an invalid window number {nr}, an empty list is
                returned. Otherwise, same as |getqflist()|.
 
+               If the optional {what} dictionary argument is supplied, then
+               returns the items listed in {what} as a dictionary. Refer to
+               |getqflist()| for the supported items in {what}.
+
 getmatches()                                           *getmatches()*
                Returns a |List| with all matches previously defined by
                |matchadd()| and the |:match| commands.  |getmatches()| is
@@ -4376,7 +4381,7 @@ getpos({expr})    Get the position for {expr}.  For possible values of {expr}
 <              Also see |getcurpos()| and |setpos()|.
 
 
-getqflist()                                            *getqflist()*
+getqflist([{what}])                                    *getqflist()*
                Returns a list with all the current quickfix errors.  Each
                list item is a dictionary with these entries:
                        bufnr   number of buffer that has the file name, use
@@ -4401,7 +4406,28 @@ getqflist()                                              *getqflist()*
                        :for d in getqflist()
                        :   echo bufname(d.bufnr) ':' d.lnum '=' d.text
                        :endfor
+<
+               If the optional {what} dictionary argument is supplied, then
+               returns only the items listed in {what} as a dictionary. The
+               following string items are supported in {what}:
+                       nr      get information for this quickfix list
+                       title   get list title
+                       winid   get window id (if opened)
+                       all     all of the above quickfix properties
+               Non-string items in {what} are ignored.
+               If "nr" is not present then the current quickfix list is used.
+               In case of error processing {what}, an empty dictionary is
+               returned.
 
+               The returned dictionary contains the following entries:
+                       nr      quickfix list number
+                       title   quickfix list title text
+                       winid   quickfix window id (if opened)
+
+               Examples: >
+                       :echo getqflist({'all': 1})
+                       :echo getqflist({'nr': 2, 'title': 1})
+<
 
 getreg([{regname} [, 1 [, {list}]]])                   *getreg()*
                The result is a String, which is the contents of register
@@ -4524,6 +4550,8 @@ glob2regpat({expr})                                        *glob2regpat()*
                        if filename =~ '^Make.*\.mak$'
 <              When {expr} is an empty string the result is "^$", match an
                empty string.
+               Note that the result depends on the system.  On MS-Windows
+               a backslash usually means a patch separator.
 
                                                                *globpath()*
 globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
@@ -6540,7 +6568,7 @@ setline({lnum}, {text})                                   *setline()*
                        :endfor
 <              Note: The '[ and '] marks are not set.
 
-setloclist({nr}, {list} [, {action}])                  *setloclist()*
+setloclist({nr}, {list} [, {action}[, {what}])         *setloclist()*
                Create or replace or add to the location list for window {nr}.
                {nr} can be the window number or the window ID.
                When {nr} is zero the current window is used.
@@ -6550,6 +6578,10 @@ setloclist({nr}, {list} [, {action}])                    *setloclist()*
                Otherwise, same as |setqflist()|.
                Also see |location-list|.
 
+               If the optional {what} dictionary argument is supplied, then
+               only the items listed in {what} are set. Refer to |setqflist()|
+               for the list of supported keys in {what}.
+
 setmatches({list})                                     *setmatches()*
                Restores a list of matches saved by |getmatches()|.  Returns 0
                if successful, otherwise -1.  All current matches are cleared
@@ -6602,8 +6634,7 @@ setpos({expr}, {list})
                also set the preferred column.  Also see the "curswant" key in
                |winrestview()|.
 
-
-setqflist({list} [, {action}])                         *setqflist()*
+setqflist({list} [, {action}[, {what}]])               *setqflist()*
                Create or replace or add to the quickfix list using the items
                in {list}.  Each item in {list} is a dictionary.
                Non-dictionary items in {list} are ignored.  Each dictionary
@@ -6648,6 +6679,20 @@ setqflist({list} [, {action}])                           *setqflist()*
                If {action} is not present or is set to ' ', then a new list
                is created.
 
+               If the optional {what} dictionary argument is supplied, then
+               only the items listed in {what} are set. The first {list}
+               argument is ignored.  The following items can be specified in
+               {what}:
+                   nr          list number in the quickfix stack
+                   title       quickfix list title text
+               Unsupported keys in {what} are ignored.
+               If the "nr" item is not present, then the current quickfix list
+               is modified.
+
+               Examples: >
+                       :call setqflist([], 'r', {'title': 'My search'})
+                       :call setqflist([], 'r', {'nr': 2, 'title': 'Errors'})
+<
                Returns zero for success, -1 for failure.
 
                This function can be used to create a quickfix list
@@ -8040,6 +8085,10 @@ There are four types of features:
 <    Note that it's possible for patch 147 to be omitted even though 148 is
     included.
 
+Hint: To find out if Vim supports backslashes in a file name (MS-Windows),
+use: `if exists('+shellslash')`
+
+
 acl                    Compiled with |ACL| support.
 all_builtin_terms      Compiled with all builtin terminals enabled.
 amiga                  Amiga version of Vim.
index 8b5ad22fedd4426962b733e538ef9d2198e7ca28..8bb002adbf46a9d5155cd9791e710af0dabdc0e8 100644 (file)
@@ -171,6 +171,7 @@ static void f_getfsize(typval_T *argvars, typval_T *rettv);
 static void f_getftime(typval_T *argvars, typval_T *rettv);
 static void f_getftype(typval_T *argvars, typval_T *rettv);
 static void f_getline(typval_T *argvars, typval_T *rettv);
+static void f_getloclist(typval_T *argvars UNUSED, typval_T *rettv UNUSED);
 static void f_getmatches(typval_T *argvars, typval_T *rettv);
 static void f_getpid(typval_T *argvars, typval_T *rettv);
 static void f_getcurpos(typval_T *argvars, typval_T *rettv);
@@ -591,11 +592,11 @@ static struct fst
     {"getftime",       1, 1, f_getftime},
     {"getftype",       1, 1, f_getftype},
     {"getline",                1, 2, f_getline},
-    {"getloclist",     1, 1, f_getqflist},
+    {"getloclist",     1, 2, f_getloclist},
     {"getmatches",     0, 0, f_getmatches},
     {"getpid",         0, 0, f_getpid},
     {"getpos",         1, 1, f_getpos},
-    {"getqflist",      0, 0, f_getqflist},
+    {"getqflist",      0, 1, f_getqflist},
     {"getreg",         0, 3, f_getreg},
     {"getregtype",     0, 1, f_getregtype},
     {"gettabvar",      2, 3, f_gettabvar},
@@ -741,10 +742,10 @@ static struct fst
     {"setcmdpos",      1, 1, f_setcmdpos},
     {"setfperm",       2, 2, f_setfperm},
     {"setline",                2, 2, f_setline},
-    {"setloclist",     2, 3, f_setloclist},
+    {"setloclist",     2, 4, f_setloclist},
     {"setmatches",     1, 1, f_setmatches},
     {"setpos",         2, 2, f_setpos},
-    {"setqflist",      1, 2, f_setqflist},
+    {"setqflist",      1, 3, f_setqflist},
     {"setreg",         2, 3, f_setreg},
     {"settabvar",      3, 3, f_settabvar},
     {"settabwinvar",   4, 4, f_settabwinvar},
@@ -4529,6 +4530,51 @@ f_getline(typval_T *argvars, typval_T *rettv)
     get_buffer_lines(curbuf, lnum, end, retlist, rettv);
 }
 
+static void get_qf_loc_list(int is_qf, win_T *wp, typval_T *what_arg, typval_T *rettv);
+
+    static void
+get_qf_loc_list(int is_qf, win_T *wp, typval_T *what_arg, typval_T *rettv)
+{
+#ifdef FEAT_QUICKFIX
+    if (what_arg->v_type == VAR_UNKNOWN)
+    {
+       if (rettv_list_alloc(rettv) == OK)
+           if (is_qf || wp != NULL)
+               (void)get_errorlist(wp, -1, rettv->vval.v_list);
+    }
+    else
+    {
+       if (rettv_dict_alloc(rettv) == OK)
+           if (is_qf || (wp != NULL))
+           {
+               if (what_arg->v_type == VAR_DICT)
+               {
+                   dict_T      *d = what_arg->vval.v_dict;
+
+                   if (d != NULL)
+                       get_errorlist_properties(wp, d, rettv->vval.v_dict);
+               }
+               else
+                   EMSG(_(e_dictreq));
+           }
+    }
+#endif
+}
+
+/*
+ * "getloclist()" function
+ */
+    static void
+f_getloclist(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+{
+#ifdef FEAT_QUICKFIX
+    win_T      *wp;
+
+    wp = find_win_by_nr(&argvars[0], NULL);
+    get_qf_loc_list(FALSE, wp, &argvars[1], rettv);
+#endif
+}
+
 /*
  * "getmatches()" function
  */
@@ -4666,28 +4712,13 @@ f_getpos(typval_T *argvars, typval_T *rettv)
 }
 
 /*
- * "getqflist()" and "getloclist()" functions
+ * "getqflist()" function
  */
     static void
 f_getqflist(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_QUICKFIX
-    win_T      *wp;
-#endif
-
-#ifdef FEAT_QUICKFIX
-    if (rettv_list_alloc(rettv) == OK)
-    {
-       wp = NULL;
-       if (argvars[0].v_type != VAR_UNKNOWN)   /* getloclist() */
-       {
-           wp = find_win_by_nr(&argvars[0], NULL);
-           if (wp == NULL)
-               return;
-       }
-
-       (void)get_errorlist(wp, rettv->vval.v_list);
-    }
+    get_qf_loc_list(TRUE, NULL, &argvars[0], rettv);
 #endif
 }
 
@@ -9525,7 +9556,7 @@ f_setline(typval_T *argvars, typval_T *rettv)
        appended_lines_mark(lcount, added);
 }
 
-static void set_qf_ll_list(win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv);
+static void set_qf_ll_list(win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *what_arg, typval_T *rettv);
 
 /*
  * Used by "setqflist()" and "setloclist()" functions
@@ -9535,6 +9566,7 @@ set_qf_ll_list(
     win_T      *wp UNUSED,
     typval_T   *list_arg UNUSED,
     typval_T   *action_arg UNUSED,
+    typval_T   *what_arg UNUSED,
     typval_T   *rettv)
 {
 #ifdef FEAT_QUICKFIX
@@ -9551,6 +9583,8 @@ set_qf_ll_list(
     else
     {
        list_T  *l = list_arg->vval.v_list;
+       dict_T  *d = NULL;
+       int     valid_dict = TRUE;
 
        if (action_arg->v_type == VAR_STRING)
        {
@@ -9567,8 +9601,20 @@ set_qf_ll_list(
        else
            EMSG(_(e_stringreq));
 
-       if (l != NULL && action && set_errorlist(wp, l, action,
-              (char_u *)(wp == NULL ? "setqflist()" : "setloclist()")) == OK)
+       if (action_arg->v_type != VAR_UNKNOWN
+               && what_arg->v_type != VAR_UNKNOWN)
+       {
+           if (what_arg->v_type == VAR_DICT)
+               d = what_arg->vval.v_dict;
+           else
+           {
+               EMSG(_(e_dictreq));
+               valid_dict = FALSE;
+           }
+       }
+
+       if (l != NULL && action && valid_dict && set_errorlist(wp, l, action,
+           (char_u *)(wp == NULL ? "setqflist()" : "setloclist()"), d) == OK)
            rettv->vval.v_number = 0;
     }
 #endif
@@ -9586,7 +9632,7 @@ f_setloclist(typval_T *argvars, typval_T *rettv)
 
     win = find_win_by_nr(&argvars[0], NULL);
     if (win != NULL)
-       set_qf_ll_list(win, &argvars[1], &argvars[2], rettv);
+       set_qf_ll_list(win, &argvars[1], &argvars[2], &argvars[3], rettv);
 }
 
 /*
@@ -9754,7 +9800,7 @@ f_setpos(typval_T *argvars, typval_T *rettv)
     static void
 f_setqflist(typval_T *argvars, typval_T *rettv)
 {
-    set_qf_ll_list(NULL, &argvars[0], &argvars[1], rettv);
+    set_qf_ll_list(NULL, &argvars[0], &argvars[1], &argvars[2], rettv);
 }
 
 /*
index 02c2d9831b48f4aa3d06dfb5d9b36520fccd186c..99f5edeefd30d72ad039f6774a7e39ad85b4b080 100644 (file)
@@ -27,8 +27,9 @@ void ex_cnext(exarg_T *eap);
 void ex_cfile(exarg_T *eap);
 void ex_vimgrep(exarg_T *eap);
 char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags);
-int get_errorlist(win_T *wp, list_T *list);
-int set_errorlist(win_T *wp, list_T *list, int action, char_u *title);
+int get_errorlist_properties(win_T *wp, dict_T *what, dict_T *retdict);
+int get_errorlist(win_T *wp, int qf_idx, list_T *list);
+int set_errorlist(win_T *wp, list_T *list, int action, char_u *title, dict_T *what);
 void ex_cbuffer(exarg_T *eap);
 void ex_cexpr(exarg_T *eap);
 void ex_helpgrep(exarg_T *eap);
index aa94ae69a3ee656acd9d25bb27eadb7b5bc7e5d7..2fa6ed98a93b68cfec934198a5722080908b7618 100644 (file)
@@ -3140,6 +3140,24 @@ qf_find_buf(qf_info_T *qi)
     return NULL;
 }
 
+/*
+ * Update the w:quickfix_title variable in the quickfix/location list window
+ */
+    static void
+qf_update_win_titlevar(qf_info_T *qi)
+{
+    win_T      *win;
+    win_T      *curwin_save;
+
+    if ((win = qf_find_win(qi)) != NULL)
+    {
+       curwin_save = curwin;
+       curwin = win;
+       qf_set_title_var(qi);
+       curwin = curwin_save;
+    }
+}
+
 /*
  * Find the quickfix buffer.  If it exists, update the contents.
  */
@@ -3148,7 +3166,6 @@ qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
 {
     buf_T      *buf;
     win_T      *win;
-    win_T      *curwin_save;
     aco_save_T aco;
 
     /* Check if a buffer for the quickfix list exists.  Update it. */
@@ -3161,13 +3178,7 @@ qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
            /* set curwin/curbuf to buf and save a few things */
            aucmd_prepbuf(&aco, buf);
 
-       if ((win = qf_find_win(qi)) != NULL)
-       {
-           curwin_save = curwin;
-           curwin = win;
-           qf_set_title_var(qi);
-           curwin = curwin_save;
-       }
+       qf_update_win_titlevar(qi);
 
        qf_fill_buffer(qi, buf, old_last);
 
@@ -4532,9 +4543,10 @@ unload_dummy_buffer(buf_T *buf, char_u *dirname_start)
 #if defined(FEAT_EVAL) || defined(PROTO)
 /*
  * Add each quickfix error to list "list" as a dictionary.
+ * If qf_idx is -1, use the current list. Otherwise, use the specified list.
  */
     int
-get_errorlist(win_T *wp, list_T *list)
+get_errorlist(win_T *wp, int qf_idx, list_T *list)
 {
     qf_info_T  *qi = &ql_info;
     dict_T     *dict;
@@ -4550,12 +4562,15 @@ get_errorlist(win_T *wp, list_T *list)
            return FAIL;
     }
 
-    if (qi->qf_curlist >= qi->qf_listcount
-           || qi->qf_lists[qi->qf_curlist].qf_count == 0)
+    if (qf_idx == -1)
+       qf_idx = qi->qf_curlist;
+
+    if (qf_idx >= qi->qf_listcount
+           || qi->qf_lists[qf_idx].qf_count == 0)
        return FAIL;
 
-    qfp = qi->qf_lists[qi->qf_curlist].qf_start;
-    for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ++i)
+    qfp = qi->qf_lists[qf_idx].qf_start;
+    for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; ++i)
     {
        /* Handle entries with a non-existing buffer number. */
        bufnum = qfp->qf_fnum;
@@ -4590,16 +4605,93 @@ get_errorlist(win_T *wp, list_T *list)
 }
 
 /*
- * Populate the quickfix list with the items supplied in the list
- * of dictionaries. "title" will be copied to w:quickfix_title.
- * "action" is 'a' for add, 'r' for replace.  Otherwise create a new list.
+ * Flags used by getqflist()/getloclist() to determine which fields to return.
+ */
+enum {
+    QF_GETLIST_NONE    = 0x0,
+    QF_GETLIST_TITLE   = 0x1,
+    QF_GETLIST_ITEMS   = 0x2,
+    QF_GETLIST_NR      = 0x4,
+    QF_GETLIST_WINID   = 0x8,
+    QF_GETLIST_ALL     = 0xFF
+};
+
+/*
+ * Return quickfix/location list details (title) as a
+ * dictionary. 'what' contains the details to return. If 'list_idx' is -1,
+ * then current list is used. Otherwise the specified list is used.
  */
     int
-set_errorlist(
-    win_T      *wp,
-    list_T     *list,
-    int                action,
-    char_u     *title)
+get_errorlist_properties(win_T *wp, dict_T *what, dict_T *retdict)
+{
+    qf_info_T  *qi = &ql_info;
+    int                status = OK;
+    int                qf_idx;
+    dictitem_T *di;
+    int                flags = QF_GETLIST_NONE;
+
+    if (wp != NULL)
+    {
+       qi = GET_LOC_LIST(wp);
+       if (qi == NULL)
+           return FAIL;
+    }
+
+    qf_idx = qi->qf_curlist;           /* default is the current list */
+    if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
+    {
+       /* Use the specified quickfix/location list */
+       if (di->di_tv.v_type == VAR_NUMBER)
+       {
+           qf_idx = di->di_tv.vval.v_number - 1;
+           if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
+               return FAIL;
+           flags |= QF_GETLIST_NR;
+       }
+       else
+           return FAIL;
+    }
+
+    if (dict_find(what, (char_u *)"all", -1) != NULL)
+       flags |= QF_GETLIST_ALL;
+
+    if (dict_find(what, (char_u *)"title", -1) != NULL)
+       flags |= QF_GETLIST_TITLE;
+
+    if (dict_find(what, (char_u *)"winid", -1) != NULL)
+       flags |= QF_GETLIST_WINID;
+
+    if (flags & QF_GETLIST_TITLE)
+    {
+       char_u  *t;
+       t = qi->qf_lists[qf_idx].qf_title;
+       if (t == NULL)
+           t = (char_u *)"";
+       status = dict_add_nr_str(retdict, "title", 0L, t);
+    }
+    if ((status == OK) && (flags & QF_GETLIST_NR))
+       status = dict_add_nr_str(retdict, "nr", qf_idx + 1, NULL);
+    if ((status == OK) && (flags & QF_GETLIST_WINID))
+    {
+       win_T   *win;
+       win = qf_find_win(qi);
+       if (win != NULL)
+           status = dict_add_nr_str(retdict, "winid", win->w_id, NULL);
+    }
+
+    return status;
+}
+
+/*
+ * Add list of entries to quickfix/location list. Each list entry is
+ * a dictionary with item information.
+ */
+    static int
+qf_add_entries(
+       qf_info_T       *qi,
+       list_T          *list,
+       char_u          *title,
+       int             action)
 {
     listitem_T *li;
     dict_T     *d;
@@ -4613,16 +4705,8 @@ set_errorlist(
 #endif
     int                valid, status;
     int                retval = OK;
-    qf_info_T  *qi = &ql_info;
     int                did_bufnr_emsg = FALSE;
 
-    if (wp != NULL)
-    {
-       qi = ll_get_or_alloc_list(wp);
-       if (qi == NULL)
-           return FAIL;
-    }
-
     if (action == ' ' || qi->qf_curlist == qi->qf_listcount)
        /* make place for a new list */
        qf_new_list(qi, title);
@@ -4719,6 +4803,74 @@ set_errorlist(
 
     return retval;
 }
+
+    static int
+qf_set_properties(qf_info_T *qi, dict_T *what)
+{
+    dictitem_T *di;
+    int                retval = FAIL;
+    int                qf_idx;
+
+    qf_idx = qi->qf_curlist;           /* default is the current list */
+    if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
+    {
+       /* Use the specified quickfix/location list */
+       if (di->di_tv.v_type == VAR_NUMBER)
+       {
+           qf_idx = di->di_tv.vval.v_number - 1;
+           if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
+               return FAIL;
+       }
+       else
+           return FAIL;
+    }
+
+    if ((di = dict_find(what, (char_u *)"title", -1)) != NULL)
+    {
+       if (di->di_tv.v_type == VAR_STRING)
+       {
+           vim_free(qi->qf_lists[qf_idx].qf_title);
+           qi->qf_lists[qf_idx].qf_title =
+               get_dict_string(what, (char_u *)"title", TRUE);
+           if (qf_idx == qi->qf_curlist)
+               qf_update_win_titlevar(qi);
+           retval = OK;
+       }
+    }
+
+    return retval;
+}
+
+/*
+ * Populate the quickfix list with the items supplied in the list
+ * of dictionaries. "title" will be copied to w:quickfix_title.
+ * "action" is 'a' for add, 'r' for replace.  Otherwise create a new list.
+ */
+    int
+set_errorlist(
+       win_T   *wp,
+       list_T  *list,
+       int     action,
+       char_u  *title,
+       dict_T  *what)
+{
+    qf_info_T  *qi = &ql_info;
+    int                retval = OK;
+
+    if (wp != NULL)
+    {
+       qi = ll_get_or_alloc_list(wp);
+       if (qi == NULL)
+           return FAIL;
+    }
+
+    if (what != NULL)
+       retval = qf_set_properties(qi, what);
+    else
+       retval = qf_add_entries(qi, list, title, action);
+
+    return retval;
+}
 #endif
 
 /*
index cfc2b51e6d7021c8f50a0964f025188e1e5c8e68..e388a438c303a6fe4467696ef6628405d615d31c 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -916,7 +916,7 @@ do_tag(
                }
 
                vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag);
-               set_errorlist(curwin, list, ' ', IObuff);
+               set_errorlist(curwin, list, ' ', IObuff, NULL);
 
                list_free(list);
                vim_free(fname);
index 9f0b5106e998198f38c041948a93e6dd1daab2a0..b7d985d0dff637b231b4014cf2fedae543b7756e 100644 (file)
@@ -1505,3 +1505,42 @@ func Test_duplicate_buf()
 
   call delete('Xgrepthis')
 endfunc
+
+" Quickfix/Location list set/get properties tests
+function Xproperty_tests(cchar)
+    call s:setup_commands(a:cchar)
+
+    " Error cases
+    call assert_fails('call g:Xgetlist(99)', 'E715:')
+    call assert_fails('call g:Xsetlist(99)', 'E714:')
+    call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
+
+    " Set and get the title
+    Xopen
+    wincmd p
+    call g:Xsetlist([{'filename':'foo', 'lnum':27}])
+    call g:Xsetlist([], 'a', {'title' : 'Sample'})
+    let d = g:Xgetlist({"title":1})
+    call assert_equal('Sample', d.title)
+
+    Xopen
+    call assert_equal('Sample', w:quickfix_title)
+    Xclose
+
+    " Invalid arguments
+    call assert_fails('call g:Xgetlist([])', 'E715')
+    call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
+    let s = g:Xsetlist([], 'a', {'abc':1})
+    call assert_equal(-1, s)
+
+    call assert_equal({}, g:Xgetlist({'abc':1}))
+
+    if a:cchar == 'l'
+       call assert_equal({}, getloclist(99, ['title']))
+    endif
+endfunction
+
+function Test_qf_property()
+    call Xproperty_tests('c')
+    call Xproperty_tests('l')
+endfunction
index b324c12aaaa609b6bf7f36a8e858de61cce01a77..66648d2708441180dbbf9fe0b3a2dc23cb09e2b4 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2200,
 /**/
     2199,
 /**/