On Mi, 22 Mai 2013, LCD 47 wrote:

>     I see.  Can you please post that as a single patch, against a
> well-defined version of Vim?  There are several versions floating around
> by now, and figguring out which pieces are still current and which are
> obsolete is, well, too complex a task for my tiny brain. :)

try this patch.

regards,
Christian
-- 
Dies ist die Probe, wie hoch man einen andern Menschen stelle und
liebe, inwieweit man von ihm in Rücksicht der Glücksgüter abhängig
sein will. Nur dies Gefühl entscheidet über die Ansicht fremden
Gehalts.
                -- Jean Paul

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1793,10 +1793,16 @@
 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
+getlocstack( {nr})		List	stack of location lists
+getlocstackptr()		Number	Returns index of current location list in stack
+getloctitle( {nr})		Lists	Returns list of titles for location list stack
 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
+getqfstack()			List	stack of quickfix lists
+getqfstackptr()			Number	Returns index of current quickfix list in stack
+getqftitle()			Lists	Returns list of titles for quickfix list stack
 getreg( [{regname} [, 1]])	String	contents of register
 getregtype( [{regname}])	String	type of register
 gettabvar( {nr}, {varname} [, {def}])
@@ -1924,11 +1930,18 @@
 setbufvar( {expr}, {varname}, {val})	set {varname} in buffer {expr} to {val}
 setcmdpos( {pos})		Number	set cursor position in command-line
 setline( {lnum}, {line})	Number	set line {lnum} to {line}
-setloclist( {nr}, {list}[, {action}])
+setloclist( {nr}, {list}[, {action}[, {title}]])
 				Number	modify location list using {list}
+setloctitle( {nr}, {string})	Number	set the |w:quickfix_title| for the
+					current location list.
+setlocstackptr( {nr}, {nr})	Number	moves within the location list stack.
 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}[, {title}]])
+				Number	modify quickfix list using {list}
+setqfstackptr( {nr})		Number	moves within the quickfix stack.
+setqftitle( {string})		Number	set the |w:quickfix_title| for the
+					current quickfix list.
 setreg( {n}, {v}[, {opt}])	Number	set register to value and type
 settabvar( {nr}, {varname}, {val})	set {varname} in tab page {nr} to {val}
 settabwinvar( {tabnr}, {winnr}, {varname}, {val})    set {varname} in window
@@ -3365,6 +3378,24 @@
 		returned.  For an invalid window number {nr}, an empty list is
 		returned. Otherwise, same as |getqflist()|.
 
+
+getlocstack({nr})					*getlocstack()*
+		Returns a list with the stack of the location lists. The
+		location list can currently handle 10 different error list,
+		which can be traversed by using |:lolder| and |:lnewer|. The
+		getlocstack() function returns the complete stack of those
+		quickfix lists. 
+
+getlocstackptr()					*getlocstackptr()*
+		Returns the index of the location list stack, that can be used
+		with the |getlocstack()| function to access the current active
+		list.
+
+getloctitle()				    		*getloctitle()*
+		Returns a list containing the title for each of the location
+		lists in the stack. The title will also be copied into the
+		|w:quickfix_title| variable.
+
 getmatches()						*getmatches()*
 		Returns a |List| with all matches previously defined by
 		|matchadd()| and the |:match| commands.  |getmatches()| is
@@ -3387,7 +3418,7 @@
 			:unlet m
 <
 
-getqflist()						*getqflist()*
+getqflist()							*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
@@ -3413,6 +3444,21 @@
 			:   echo bufname(d.bufnr) ':' d.lnum '=' d.text
 			:endfor
 
+getqfstack({nr})						*getqfstack()*
+		Returns a list with the stack of the quickfix lists. The
+		quickfix list can currently handle 10 different error list,
+		which can be traversed by using |:colder| and |:cnewer|. The
+		getqfstack() function returns the complete stack of those
+		quickfix lists. 
+
+getqfstackptr()						*getqfstackptr()*
+		Returns the index of the quickfix stack, that can be used with
+		the |getqfstack()| function to access the current active list.
+
+getqftitle()				    		*getqftitle()*
+		Returns a list containing the title for each of the quickfix
+		lists in the stack. The title will also be copied into the
+		|w:quickfix_title| variable.
 
 getreg([{regname} [, 1]])				*getreg()*
 		The result is a String, which is the contents of register
@@ -5186,14 +5232,26 @@
 			:endfor
 <		Note: The '[ and '] marks are not set.
 
-setloclist({nr}, {list} [, {action}])			*setloclist()*
+setloclist({nr}, {list} [, {action}[, {title}]])		*setloclist()*
 		Create or replace or add to the location list for window {nr}.
 		When {nr} is zero the current window is used. For a location
 		list window, the displayed location list is modified.  For an
-		invalid window number {nr}, -1 is returned.
+		invalid window number {nr}, -1 is returned. If {title} is
+		given, it will be stored in the variable |w:quickfix_title|.
 		Otherwise, same as |setqflist()|.
 		Also see |location-list|.
 
+setlocstackptr({nr}, {index})				 *setlocstackptr()*
+		Sets the current item in the location list stack to {index}.
+		Returns -1 for invalid index item.
+		That is the same as using |:lolder| or |:lnewer|
+
+setloctitle({nr}, {string})					 *setloctitle()*
+		Set {string} as title for the current item in the location
+		list stack for window {nr}. If {nr} is zero, the current
+		window will be used. The title will then be available as
+		|w:quickfix_title| variable. Also see |location-list|.
+
 setmatches({list})					*setmatches()*
 		Restores a list of matches saved by |getmatches()|.  Returns 0
 		if successful, otherwise -1.  All current matches are cleared
@@ -5233,7 +5291,7 @@
 		vertically.  See |winrestview()| for that.
 
 
-setqflist({list} [, {action}])				*setqflist()*
+setqflist({list} [, {action}[, {title}]])			*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
@@ -5270,7 +5328,8 @@
 		list, then a new list is created. If {action} is set to 'r',
 		then the items from the current quickfix list are replaced
 		with the items from {list}. If {action} is not present or is
-		set to ' ', then a new list is created.
+		set to ' ', then a new list is created. If {title} is
+		given, it will be stored in the variable |w:quickfix_title|.
 
 		Returns zero for success, -1 for failure.
 
@@ -5278,6 +5337,15 @@
 		independent of the 'errorformat' setting.  Use a command like
 		":cc 1" to jump to the first position.
 
+setqfstackptr({index})					 *setqfstackptr()*
+		Sets the current item in the quickfix list stack to {index}.
+		Returns -1 for invalid index item.
+		That is the same as using |:colder| or |:cnewer|
+
+setqftitle({string})					 *setqftitle()*
+		Set {string} as title for the current item in the quickfix
+		list stack. The title will then be available as
+		|w:quickfix_title| variable.
 
 							*setreg()*
 setreg({regname}, {value} [,{options}])
diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -779,9 +779,19 @@
 
 Quickfix and location lists:			*quickfix-functions*
 	getqflist()		list of quickfix errors
+	getqfstack()		stack of quickfix lists
+	getqfstackptr()		index in stack of quickfix lists
+	getqftitle()		list of titles of quickfix list stack
 	setqflist()		modify a quickfix list
+	setqftitle()		sets the title for the quickfix list
+	setqfstackptr()		moves within the quickfix stack
 	getloclist()		list of location list items
+	getlocstack()		stack of location lists
+	getlocstackptr()	index in stack of location lists
+	getloctitle()		list of titles of location list stack
 	setloclist()		modify a location list
+	setloctitle()		sets the title for the location list
+	setlocstackptr()	moves within the location list stack
 
 Insert mode completion:				*completion-functions*
 	complete()		set found matches
diff --git a/src/eval.c b/src/eval.c
--- a/src/eval.c
+++ b/src/eval.c
@@ -553,6 +553,9 @@
 static void f_getpid __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_getqfstack __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_getqfstackptr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_getqftitle __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getregtype __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_gettabvar __ARGS((typval_T *argvars, typval_T *rettv));
@@ -669,6 +672,10 @@
 static void f_setcmdpos __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setline __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_setloctitle __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_setlocstackptr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_setqfstackptr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_setqftitle __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setmatches __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv));
@@ -7932,10 +7939,16 @@
     {"getftype",	1, 1, f_getftype},
     {"getline",		1, 2, f_getline},
     {"getloclist",	1, 1, f_getqflist},
+    {"getlocstack",	1, 1, f_getqfstack},
+    {"getlocstackptr",	1, 1, f_getqfstackptr},
+    {"getloctitle",	1, 1, f_getqftitle},
     {"getmatches",	0, 0, f_getmatches},
     {"getpid",		0, 0, f_getpid},
     {"getpos",		1, 1, f_getpos},
     {"getqflist",	0, 0, f_getqflist},
+    {"getqfstack",	0, 0, f_getqfstack},
+    {"getqfstackptr",	0, 0, f_getqfstackptr},
+    {"getqftitle",	0, 0, f_getqftitle},
     {"getreg",		0, 2, f_getreg},
     {"getregtype",	0, 1, f_getregtype},
     {"gettabvar",	2, 3, f_gettabvar},
@@ -8053,10 +8066,14 @@
     {"setbufvar",	3, 3, f_setbufvar},
     {"setcmdpos",	1, 1, f_setcmdpos},
     {"setline",		2, 2, f_setline},
-    {"setloclist",	2, 3, f_setloclist},
+    {"setloclist",	2, 4, f_setloclist},
+    {"setlocstackptr",	2, 2, f_setlocstackptr},
+    {"setloctitle",	2, 2, f_setloctitle},
     {"setmatches",	1, 1, f_setmatches},
     {"setpos",		2, 2, f_setpos},
-    {"setqflist",	1, 2, f_setqflist},
+    {"setqflist",	1, 3, f_setqflist},
+    {"setqfstackptr",	1, 1, f_setqfstackptr},
+    {"setqftitle",	1, 1, f_setqftitle},
     {"setreg",		2, 3, f_setreg},
     {"settabvar",	3, 3, f_settabvar},
     {"settabwinvar",	4, 4, f_settabwinvar},
@@ -11670,7 +11687,90 @@
 		return;
 	}
 
-	(void)get_errorlist(wp, rettv->vval.v_list);
+	(void)get_errorlist(wp, rettv->vval.v_list, NULL);
+    }
+#endif
+}
+
+/*
+ * "getqfstackptr()" and "getlocstackptr()" functions
+ */
+    static void
+f_getqfstackptr(argvars, rettv)
+    typval_T	*argvars UNUSED;
+    typval_T	*rettv UNUSED;
+{
+#ifdef FEAT_QUICKFIX
+    win_T	*wp;
+#endif
+
+#ifdef FEAT_QUICKFIX
+    wp = NULL;
+    if (argvars[0].v_type != VAR_UNKNOWN)	/* getloclist() */
+    {
+	wp = find_win_by_nr(&argvars[0], NULL);
+	if (wp == NULL)
+	    return;
+    }
+
+    rettv->vval.v_number = qf_get_curitem(wp);
+#endif
+}
+
+/*
+ * "getqfstack()" functions
+ */
+    static void
+f_getqfstack(argvars, rettv)
+    typval_T	*argvars UNUSED;
+    typval_T	*rettv UNUSED;
+{
+#ifdef FEAT_QUICKFIX
+    win_T	*wp;
+    list_T	*l = list_alloc();
+#endif
+
+#ifdef FEAT_QUICKFIX
+    if (rettv_list_alloc(rettv) == OK && l != NULL)
+    {
+	wp = NULL;
+	++l->lv_refcount;
+	if (argvars[0].v_type != VAR_UNKNOWN)	/* getlocstack() */
+	{
+	    wp = find_win_by_nr(&argvars[0], NULL);
+	    if (wp == NULL)
+		return;
+	}
+
+	(void)get_errorlist(wp, l, rettv->vval.v_list);
+    }
+#endif
+}
+
+/*
+ * "getqftitle()" functions
+ */
+    static void
+f_getqftitle(argvars, rettv)
+    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)	/* getloctitle() */
+	{
+	    wp = find_win_by_nr(&argvars[0], NULL);
+	    if (wp == NULL)
+		return;
+	}
+
+	(void)get_errortitle(wp, rettv->vval.v_list);
     }
 #endif
 }
@@ -16331,21 +16431,23 @@
 	appended_lines_mark(lcount, added);
 }
 
-static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv));
+static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *title_arg, typval_T *rettv));
 
 /*
  * Used by "setqflist()" and "setloclist()" functions
  */
     static void
-set_qf_ll_list(wp, list_arg, action_arg, rettv)
+set_qf_ll_list(wp, list_arg, action_arg, title_arg, rettv)
     win_T	*wp UNUSED;
     typval_T	*list_arg UNUSED;
     typval_T	*action_arg UNUSED;
+    typval_T	*title_arg UNUSED;
     typval_T	*rettv;
 {
 #ifdef FEAT_QUICKFIX
     char_u	*act;
     int		action = ' ';
+    char_u	*title = NULL;
 #endif
 
     rettv->vval.v_number = -1;
@@ -16365,9 +16467,16 @@
 	    if (*act == 'a' || *act == 'r')
 		action = *act;
 	}
-
-	if (l != NULL && set_errorlist(wp, l, action,
-	       (char_u *)(wp == NULL ? "setqflist()" : "setloclist()")) == OK)
+	if (title_arg->v_type == VAR_STRING)
+	{
+	    title = get_tv_string_chk(title_arg);
+	    if (title == NULL)
+		return;		/* type error; errmsg already given */
+	}
+	if (title == NULL)
+	    title =  (char_u*)(wp == NULL ? "setqflist()" : "setloclist()");
+
+	if (l != NULL && set_errorlist(wp, l, action, title) == OK)
 	    rettv->vval.v_number = 0;
     }
 #endif
@@ -16387,8 +16496,9 @@
 
     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);
+}
+
 
 /*
  * "setmatches()" function
@@ -16502,7 +16612,95 @@
     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);
+}
+
+/*
+ * "setqftitle()" functions
+ */
+    static void
+f_setqftitle(argvars, rettv)
+    typval_T	*argvars UNUSED;
+    typval_T	*rettv UNUSED;
+{
+    char_u  *varname;
+    varname = get_tv_string_chk(&argvars[0]);
+
+#ifdef FEAT_QUICKFIX
+    if (varname != NULL)
+	(void)win_set_qf_title(NULL, varname );
+#endif
+}
+
+/*
+ * "setlocstackptr()" functions
+ */
+    static void
+f_setlocstackptr(argvars, rettv)
+    typval_T	*argvars UNUSED;
+    typval_T	*rettv UNUSED;
+{
+#ifdef FEAT_QUICKFIX
+    int	    number;
+    win_T   *wp;
+
+    rettv->vval.v_number = -1;
+    wp = NULL;
+    wp = find_win_by_nr(&argvars[0], NULL);
+    if (wp == NULL)
+	return;
+    number = (int)get_tv_number_chk(&argvars[1], NULL);
+    if (number == -1)
+	return;
+    else
+	rettv->vval.v_number = qf_set_curitem(wp, number);
+#endif
+}
+
+/*
+ * "setloctitle()" functions
+ */
+    static void
+f_setloctitle(argvars, rettv)
+    typval_T	*argvars UNUSED;
+    typval_T	*rettv UNUSED;
+{
+#ifdef FEAT_QUICKFIX
+    char_u  *varname;
+    win_T	*wp;
+
+    wp = NULL;
+    if (argvars[0].v_type != VAR_UNKNOWN)	/* getloclist() */
+    {
+	wp = find_win_by_nr(&argvars[0], NULL);
+	if (wp == NULL)
+	    return;
+    }
+    varname = get_tv_string_chk(&argvars[1]);
+
+    if (varname != NULL)
+	(void)win_set_qf_title(wp, varname );
+#endif
+}
+
+/*
+ * "setqfstackptr()" functions
+ */
+    static void
+f_setqfstackptr(argvars, rettv)
+    typval_T	*argvars UNUSED;
+    typval_T	*rettv UNUSED;
+{
+#ifdef FEAT_QUICKFIX
+    int	    number;
+
+    rettv->vval.v_number = -1;
+    number = (int)get_tv_number_chk(&argvars[0], NULL);
+    if (number == -1)
+	return;
+    else
+	rettv->vval.v_number = qf_set_curitem(NULL, number);
+#endif
 }
 
 /*
@@ -16698,6 +16896,15 @@
 		STRCPY(winvarname, "w:");
 		STRCPY(winvarname + 2, varname);
 		set_var(winvarname, varp, TRUE);
+		if (STRCMP(varname, "quickfix_title") == 0)
+		{
+		    dictitem_T	*v;
+
+		    v = find_var_in_ht(&win->w_vars->dv_hashtab, 'w', varname, FALSE);
+		    if (v != NULL)
+			win_set_qf_title(curwin, (&v->di_tv)->vval.v_string); 
+		}
+
 		vim_free(winvarname);
 	    }
 	}
diff --git a/src/proto/quickfix.pro b/src/proto/quickfix.pro
--- a/src/proto/quickfix.pro
+++ b/src/proto/quickfix.pro
@@ -1,10 +1,14 @@
 /* quickfix.c */
 int qf_init __ARGS((win_T *wp, char_u *efile, char_u *errorformat, int newlist, char_u *qf_title));
+void qf_reset_listcount __ARGS((win_T *wp));
+int qf_set_curitem __ARGS((win_T *wp, int count));
+int qf_get_curitem __ARGS((win_T *wp));
 void qf_free_all __ARGS((win_T *wp));
 void copy_loclist __ARGS((win_T *from, win_T *to));
 void qf_jump __ARGS((qf_info_T *qi, int dir, int errornr, int forceit));
 void qf_list __ARGS((exarg_T *eap));
 void qf_age __ARGS((exarg_T *eap));
+void win_set_qf_title __ARGS((win_T *wp, char_u *title));
 void qf_mark_adjust __ARGS((win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after));
 void ex_cwindow __ARGS((exarg_T *eap));
 void ex_cclose __ARGS((exarg_T *eap));
@@ -22,7 +26,8 @@
 void ex_cfile __ARGS((exarg_T *eap));
 void ex_vimgrep __ARGS((exarg_T *eap));
 char_u *skip_vimgrep_pat __ARGS((char_u *p, char_u **s, int *flags));
-int get_errorlist __ARGS((win_T *wp, list_T *list));
+int get_errortitle __ARGS((win_T *wp, list_T *list));
+int get_errorlist __ARGS((win_T *wp, list_T *list, list_T *list_all));
 int set_errorlist __ARGS((win_T *wp, list_T *list, int action, char_u *title));
 void ex_cbuffer __ARGS((exarg_T *eap));
 void ex_cexpr __ARGS((exarg_T *eap));
diff --git a/src/quickfix.c b/src/quickfix.c
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -914,13 +914,7 @@
 	qi->qf_curlist = qi->qf_listcount++;
     vim_memset(&qi->qf_lists[qi->qf_curlist], 0, (size_t)(sizeof(qf_list_T)));
     if (qf_title != NULL)
-    {
-	char_u *p = alloc((int)STRLEN(qf_title) + 2);
-
-	qi->qf_lists[qi->qf_curlist].qf_title = p;
-	if (p != NULL)
-	    sprintf((char *)p, ":%s", (char *)qf_title);
-    }
+	qi->qf_lists[qi->qf_curlist].qf_title = vim_strsave(qf_title);
 }
 
 /*
@@ -949,6 +943,56 @@
 }
 
     void
+qf_reset_listcount(wp)
+    win_T	*wp;
+{
+    qf_info_T	*qi = &ql_info;
+
+    if (wp != NULL)
+	qi = (IS_LL_WINDOW(wp) ? wp->w_llist_ref : wp->w_llist);
+
+    qi->qf_listcount = 0;
+    qi->qf_curlist = 0;
+}
+
+/* set the current item for the quickfix/location list */
+    int
+qf_set_curitem(wp, count)
+    win_T	*wp;
+    int		count;
+{
+    qf_info_T	*qi = &ql_info;
+
+    if (wp != NULL)
+	qi = (IS_LL_WINDOW(wp) ? wp->w_llist_ref : wp->w_llist);
+
+    if (qi == NULL || count >= qi->qf_listcount)
+	return -1;
+    else
+    {
+	qi->qf_curlist = count;
+	qf_update_buffer(qi);
+	return OK;
+    }
+}
+
+/* get the current item for the quickfix/location list */
+    int
+qf_get_curitem(wp)
+    win_T	*wp;
+{
+    qf_info_T	*qi = &ql_info;
+
+    if (wp != NULL)
+	qi = (IS_LL_WINDOW(wp) ? wp->w_llist_ref : wp->w_llist);
+
+    if (qi == NULL)
+	return 0;
+    else
+	return qi->qf_curlist;
+}
+
+    void
 qf_free_all(wp)
     win_T	*wp;
 {
@@ -2587,6 +2631,31 @@
 				    qi->qf_lists[qi->qf_curlist].qf_title);
 }
 
+    void
+win_set_qf_title(wp, title)
+    win_T   *wp;
+    char_u  *title;
+{
+    qf_info_T	*qi;
+
+    if (wp == NULL || IS_QF_WINDOW(wp))
+	qi  = &ql_info;
+    else if (IS_LL_WINDOW(wp))
+	qi  = wp->w_llist_ref;
+    else
+	return;
+
+    if (title != NULL)
+    {
+	vim_free(qi->qf_lists[qi->qf_curlist].qf_title);
+	qi->qf_lists[qi->qf_curlist].qf_title = vim_strsave(title);
+	qf_set_title(qi);
+#ifdef FEAT_WINDOWS
+	qf_update_buffer(qi);
+#endif
+    }
+}
+
 /*
  * Fill current buffer with quickfix errors, replacing any previous contents.
  * curbuf must be the quickfix buffer!
@@ -2784,6 +2853,7 @@
     int		res;
 #ifdef FEAT_AUTOCMD
     char_u	*au_name = NULL;
+    char_u	title[130] = ":";
 
     /* Redirect ":grep" to ":vimgrep" if 'grepprg' is "internal". */
     if (grep_internal(eap->cmdidx))
@@ -2856,10 +2926,10 @@
 #endif
 
     res = qf_init(wp, fname, (eap->cmdidx != CMD_make
-			    && eap->cmdidx != CMD_lmake) ? p_gefm : p_efm,
-					   (eap->cmdidx != CMD_grepadd
-					    && eap->cmdidx != CMD_lgrepadd),
-					   *eap->cmdlinep);
+	    && eap->cmdidx != CMD_lmake) ? p_gefm : p_efm,
+		(eap->cmdidx != CMD_grepadd
+		&& eap->cmdidx != CMD_lgrepadd),
+		(char_u *)STRNCAT(title, *eap->cmdlinep, (size_t) 128));
     if (wp != NULL)
 	qi = GET_LOC_LIST(wp);
 #ifdef FEAT_AUTOCMD
@@ -3022,6 +3092,7 @@
 #ifdef FEAT_AUTOCMD
     char_u	*au_name = NULL;
 #endif
+    char_u	title[130] = ":";
 
     if (eap->cmdidx == CMD_lfile || eap->cmdidx == CMD_lgetfile
 					       || eap->cmdidx == CMD_laddfile)
@@ -3067,10 +3138,10 @@
      * quickfix list then a new list is created.
      */
     if (qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
-				  && eap->cmdidx != CMD_laddfile),
-							   *eap->cmdlinep) > 0
-				  && (eap->cmdidx == CMD_cfile
-					     || eap->cmdidx == CMD_lfile))
+	    && eap->cmdidx != CMD_laddfile),
+	    (char_u*) STRNCAT(title, *eap->cmdlinep, (size_t) 128)) > 0
+	    && (eap->cmdidx == CMD_cfile
+			    || eap->cmdidx == CMD_lfile))
     {
 #ifdef FEAT_AUTOCMD
 	if (au_name != NULL)
@@ -3131,6 +3202,8 @@
     char_u	*dirname_start = NULL;
     char_u	*dirname_now = NULL;
     char_u	*target_dir = NULL;
+    char_u	title[130] = ":";
+    char_u      *q = vim_strnsave(*eap->cmdlinep, 128);
 #ifdef FEAT_AUTOCMD
     char_u	*au_name =  NULL;
 
@@ -3208,7 +3281,7 @@
 	 eap->cmdidx != CMD_vimgrepadd && eap->cmdidx != CMD_lvimgrepadd)
 					|| qi->qf_curlist == qi->qf_listcount)
 	/* make place for a new list */
-	qf_new_list(qi, *eap->cmdlinep);
+	qf_new_list(qi, (char_u *)STRNCAT(title, q, (size_t) 128));
     else if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
 	/* Adding to existing list, find last entry. */
 	for (prevp = qi->qf_lists[qi->qf_curlist].qf_start;
@@ -3310,7 +3383,7 @@
 	    if (idx == LISTCOUNT)
 	    {
 		/* List cannot be found, create a new one. */
-		qf_new_list(qi, *eap->cmdlinep);
+		qf_new_list(qi, (char_u *)STRNCAT(title, q, (size_t) 128));
 		cur_qf_start = qi->qf_lists[qi->qf_curlist].qf_start;
 	    }
 	}
@@ -3488,6 +3561,7 @@
     vim_free(dirname_start);
     vim_free(target_dir);
     vim_free(regmatch.regprog);
+    vim_free(q);
 }
 
 /*
@@ -3715,12 +3789,42 @@
 
 #if defined(FEAT_EVAL) || defined(PROTO)
 /*
+ * Populate the list "list" with all quickfix/location list titles
+ */
+    int
+get_errortitle(wp, list)
+    win_T	*wp;
+    list_T	*list;
+{
+    char_u	*title;
+    qf_info_T	*qi = &ql_info;
+    int		j;
+
+    if (wp != NULL)
+	qi = GET_LOC_LIST(wp);
+
+    if (qi == NULL)
+	return FAIL;
+
+    for (j = 0; qi != NULL && j < qi->qf_listcount; j++)
+    {
+	if (list != NULL)
+	{
+	    title = qi->qf_lists[j].qf_title;
+
+	    list_append_string(list, title == NULL ? (char_u *)"" : title, -1);
+	}
+    }
+    return OK;
+}
+/*
  * Add each quickfix error to list "list" as a dictionary.
  */
     int
-get_errorlist(wp, list)
+get_errorlist(wp, list, list_all)
     win_T	*wp;
     list_T	*list;
+    list_T 	*list_all;
 {
     qf_info_T	*qi = &ql_info;
     dict_T	*dict;
@@ -3728,48 +3832,69 @@
     qfline_T	*qfp;
     int		i;
     int		bufnum;
+    int		j;
 
     if (wp != NULL)
+	qi = GET_LOC_LIST(wp);
+
+    if (qi == NULL || qi->qf_curlist >= qi->qf_listcount
+	    || (list_all == NULL && qi->qf_lists[qi->qf_curlist].qf_count == 0))
+	return FAIL;
+
+    j = (list_all != NULL ? 0 : qi->qf_curlist);
+
+    for (; j < LISTCOUNT; j++)
     {
-	qi = GET_LOC_LIST(wp);
-	if (qi == NULL)
-	    return FAIL;
+	listitem_T *li = listitem_alloc();
+
+	qfp = qi->qf_lists[j].qf_start;
+	for (i = 1; !got_int && qi != NULL && i <= qi->qf_lists[j].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)
+		return FAIL;
+
+	    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
+	    || dict_add_nr_str(dict, "nr",    (long)qfp->qf_nr, NULL) == FAIL
+	    || dict_add_nr_str(dict, "pattern",  0L,
+		qfp->qf_pattern == NULL ? (char_u *)"" : qfp->qf_pattern) == FAIL
+	    || dict_add_nr_str(dict, "text",  0L,
+		    qfp->qf_text == NULL ? (char_u *)"" : qfp->qf_text) == FAIL
+	    || dict_add_nr_str(dict, "type",  0L, buf) == FAIL
+	    || dict_add_nr_str(dict, "valid", (long)qfp->qf_valid, NULL) == FAIL)
+		return FAIL;
+
+	    qfp = qfp->qf_next;
+	}
+	if (list_all == NULL)
+	    break;
+	else if (qi != NULL && qi->qf_lists[j].qf_count)
+	{
+	    if (list != NULL)
+	    {
+		list_append(list_all, li);
+		li->li_tv.v_type = VAR_LIST;
+		li->li_tv.v_lock = 0;
+		li->li_tv.vval.v_list = list;
+
+		if ((list = list_alloc()) == NULL)
+		    return FAIL;
+	    }
+	}
     }
-
-    if (qi->qf_curlist >= qi->qf_listcount
-	    || qi->qf_lists[qi->qf_curlist].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)
-    {
-	/* 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)
-	    return FAIL;
-
-	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
-	  || dict_add_nr_str(dict, "nr",    (long)qfp->qf_nr, NULL) == FAIL
-	  || dict_add_nr_str(dict, "pattern",  0L,
-	     qfp->qf_pattern == NULL ? (char_u *)"" : qfp->qf_pattern) == FAIL
-	  || dict_add_nr_str(dict, "text",  0L,
-		   qfp->qf_text == NULL ? (char_u *)"" : qfp->qf_text) == FAIL
-	  || dict_add_nr_str(dict, "type",  0L, buf) == FAIL
-	  || dict_add_nr_str(dict, "valid", (long)qfp->qf_valid, NULL) == FAIL)
-	    return FAIL;
-
-	qfp = qfp->qf_next;
-    }
+    if (list_all != NULL)
+	list_free(list, TRUE);
     return OK;
 }
 
@@ -3807,6 +3932,7 @@
     if (action == ' ' || qi->qf_curlist == qi->qf_listcount)
 	/* make place for a new list */
 	qf_new_list(qi, title);
+
     else if (action == 'a' && qi->qf_lists[qi->qf_curlist].qf_count > 0)
 	/* Adding to existing list, find last entry. */
 	for (prevp = qi->qf_lists[qi->qf_curlist].qf_start;
@@ -3815,6 +3941,12 @@
     else if (action == 'r')
 	qf_free(qi, qi->qf_curlist);
 
+    if (title != NULL && action != ' ')
+    {
+	vim_free(qi->qf_lists[qi->qf_curlist].qf_title);
+	qi->qf_lists[qi->qf_curlist].qf_title = vim_strsave(title);
+    }
+
     for (li = list->lv_first; li != NULL; li = li->li_next)
     {
 	if (li->li_tv.v_type != VAR_DICT)
@@ -4026,6 +4158,7 @@
 #ifdef FEAT_AUTOCMD
     char_u	*au_name =  NULL;
 #endif
+    char_u	title[130] = ":";
 
 #ifdef FEAT_MULTI_LANG
     /* Check for a specified language */
@@ -4088,7 +4221,7 @@
 #endif
 
 	/* create a new quickfix list */
-	qf_new_list(qi, *eap->cmdlinep);
+	qf_new_list(qi, (char_u*)STRNCAT(title, *eap->cmdlinep, (size_t) 128));
 
 	/* Go through all directories in 'runtimepath' */
 	p = p_rtp;

Raspunde prin e-mail lui