patch 7.4.2200
Problem: Cannot get all information about a quickfix list.
Solution: Add an optional argument to get/set loc/qf list(). (Yegappan
Lakshmanan)
diff --git a/src/quickfix.c b/src/quickfix.c
index aa94ae6..2fa6ed9 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -3141,6 +3141,24 @@
}
/*
+ * 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.
*/
static void
@@ -3148,7 +3166,6 @@
{
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 @@
/* 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 @@
#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 @@
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 @@
}
/*
- * 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 @@
#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 @@
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
/*