Hi Bram!
On Mi, 08 Mai 2013, Bram Moolenaar wrote:
>
> The documentation update appears to be missing.
Updated patch attached. Includes documentation and fixes the issue
mentioned so far plus allows setting the w:quickfix_title using
setwinvar().
Mit freundlichen Grüßen
Christian
--
Die Wissenschaft ist der Verstand der Welt, die Kunst ihre Seele.
-- Maxim Gorkij
--
--
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
@@ -1924,11 +1924,12 @@
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}
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}
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
@@ -5200,11 +5201,12 @@
: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|.
@@ -5247,7 +5249,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
@@ -5284,7 +5286,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.
diff --git a/src/eval.c b/src/eval.c
--- a/src/eval.c
+++ b/src/eval.c
@@ -8067,10 +8067,10 @@
{"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},
{"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},
@@ -16385,21 +16385,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;
@@ -16419,9 +16421,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
@@ -16441,7 +16450,7 @@
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);
}
/*
@@ -16556,7 +16565,7 @@
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);
}
/*
@@ -16757,6 +16766,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
@@ -5,6 +5,7 @@
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));
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);
}
/*
@@ -2588,6 +2582,25 @@
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 (IS_LL_WINDOW(wp))
+ qi = wp->w_llist_ref;
+ else
+ qi = &ql_info;
+
+ if (title != NULL)
+ {
+ vim_free(qi->qf_lists[qi->qf_curlist].qf_title);
+ qi->qf_lists[qi->qf_curlist].qf_title = vim_strsave(title);
+ }
+}
+
/*
* Fill current buffer with quickfix errors, replacing any previous contents.
* curbuf must be the quickfix buffer!
@@ -3132,6 +3145,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;
@@ -3209,7 +3224,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;
@@ -3311,7 +3326,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;
}
}
@@ -3489,6 +3504,7 @@
vim_free(dirname_start);
vim_free(target_dir);
vim_free(regmatch.regprog);
+ vim_free(q);
}
/*
@@ -3808,6 +3824,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;
@@ -3816,6 +3833,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)
@@ -4027,6 +4050,7 @@
#ifdef FEAT_AUTOCMD
char_u *au_name = NULL;
#endif
+ char_u title[130] = ":";
#ifdef FEAT_MULTI_LANG
/* Check for a specified language */
@@ -4089,7 +4113,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;