mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
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)
This commit is contained in:
parent
107abd2ca5
commit
d823fa910c
@ -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
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -207,7 +207,7 @@ this won't happen: >
|
|||||||
let otherDict.myFunction = myDict.myFunction
|
let otherDict.myFunction = myDict.myFunction
|
||||||
call otherDict.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 ~
|
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".
|
example, when jumping to a tag the value is ":tag tagname\r".
|
||||||
For ":edit +cmd file" the value is ":cmd\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_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_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_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_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_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_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_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_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_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:t_string Value of String type. Read-only. See: |type()|
|
||||||
|
|
||||||
*v:termresponse* *termresponse-variable*
|
*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}
|
getftype({fname}) String description of type of file {fname}
|
||||||
getline({lnum}) String line {lnum} of current buffer
|
getline({lnum}) String line {lnum} of current buffer
|
||||||
getline({lnum}, {end}) List lines {lnum} to {end} 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
|
getmatches() List list of current matches
|
||||||
getpid() Number process ID of Vim
|
getpid() Number process ID of Vim
|
||||||
getpos({expr}) List position of cursor, mark, etc.
|
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}]]])
|
getreg([{regname} [, 1 [, {list}]]])
|
||||||
String or List contents of register
|
String or List contents of register
|
||||||
getregtype([{regname}]) String type 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
|
setcmdpos({pos}) Number set cursor position in command-line
|
||||||
setfperm({fname}, {mode}) Number set {fname} file permissions to {mode}
|
setfperm({fname}, {mode}) Number set {fname} file permissions to {mode}
|
||||||
setline({lnum}, {line}) Number set line {lnum} to {line}
|
setline({lnum}, {line}) Number set line {lnum} to {line}
|
||||||
setloclist({nr}, {list}[, {action}])
|
setloclist({nr}, {list}[, {action}[, {what}]])
|
||||||
Number modify location list using {list}
|
Number modify location list using {list}
|
||||||
setmatches({list}) Number restore a list of matches
|
setmatches({list}) Number restore a list of matches
|
||||||
setpos({expr}, {list}) Number set the {expr} position to {list}
|
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
|
setreg({n}, {v}[, {opt}]) Number set register to value and type
|
||||||
settabvar({nr}, {varname}, {val}) none set {varname} in tab page {nr} to {val}
|
settabvar({nr}, {varname}, {val}) none set {varname} in tab page {nr} to {val}
|
||||||
settabwinvar({tabnr}, {winnr}, {varname}, {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*
|
complete({startcol}, {matches}) *complete()* *E785*
|
||||||
Set the matches for Insert mode completion.
|
Set the matches for Insert mode completion.
|
||||||
Can only be used in Insert mode. You need to use a mapping
|
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 CTRL-R = (see |i_CTRL-R|). It does not work after CTRL-O
|
||||||
with an expression mapping.
|
or with an expression mapping.
|
||||||
{startcol} is the byte offset in the line where the completed
|
{startcol} is the byte offset in the line where the completed
|
||||||
text start. The text up to the cursor is the original text
|
text start. The text up to the cursor is the original text
|
||||||
that will be replaced by the matches. Use col('.') for an
|
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()|
|
< 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
|
Returns a list with all the entries in the location list for
|
||||||
window {nr}. {nr} can be the window number or the window ID.
|
window {nr}. {nr} can be the window number or the window ID.
|
||||||
When {nr} is zero the current window is used.
|
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. For an invalid window number {nr}, an empty list is
|
||||||
returned. Otherwise, same as |getqflist()|.
|
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()*
|
getmatches() *getmatches()*
|
||||||
Returns a |List| with all matches previously defined by
|
Returns a |List| with all matches previously defined by
|
||||||
|matchadd()| and the |:match| commands. |getmatches()| is
|
|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()|.
|
< Also see |getcurpos()| and |setpos()|.
|
||||||
|
|
||||||
|
|
||||||
getqflist() *getqflist()*
|
getqflist([{what}]) *getqflist()*
|
||||||
Returns a list with all the current quickfix errors. Each
|
Returns a list with all the current quickfix errors. Each
|
||||||
list item is a dictionary with these entries:
|
list item is a dictionary with these entries:
|
||||||
bufnr number of buffer that has the file name, use
|
bufnr number of buffer that has the file name, use
|
||||||
@ -4401,7 +4406,28 @@ getqflist() *getqflist()*
|
|||||||
:for d in getqflist()
|
:for d in getqflist()
|
||||||
: echo bufname(d.bufnr) ':' d.lnum '=' d.text
|
: echo bufname(d.bufnr) ':' d.lnum '=' d.text
|
||||||
:endfor
|
: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()*
|
getreg([{regname} [, 1 [, {list}]]]) *getreg()*
|
||||||
The result is a String, which is the contents of register
|
The result is a String, which is the contents of register
|
||||||
@ -4524,6 +4550,8 @@ glob2regpat({expr}) *glob2regpat()*
|
|||||||
if filename =~ '^Make.*\.mak$'
|
if filename =~ '^Make.*\.mak$'
|
||||||
< When {expr} is an empty string the result is "^$", match an
|
< When {expr} is an empty string the result is "^$", match an
|
||||||
empty string.
|
empty string.
|
||||||
|
Note that the result depends on the system. On MS-Windows
|
||||||
|
a backslash usually means a patch separator.
|
||||||
|
|
||||||
*globpath()*
|
*globpath()*
|
||||||
globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
|
globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
|
||||||
@ -6540,7 +6568,7 @@ setline({lnum}, {text}) *setline()*
|
|||||||
:endfor
|
:endfor
|
||||||
< Note: The '[ and '] marks are not set.
|
< 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}.
|
Create or replace or add to the location list for window {nr}.
|
||||||
{nr} can be the window number or the window ID.
|
{nr} can be the window number or the window ID.
|
||||||
When {nr} is zero the current window is used.
|
When {nr} is zero the current window is used.
|
||||||
@ -6550,6 +6578,10 @@ setloclist({nr}, {list} [, {action}]) *setloclist()*
|
|||||||
Otherwise, same as |setqflist()|.
|
Otherwise, same as |setqflist()|.
|
||||||
Also see |location-list|.
|
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()*
|
setmatches({list}) *setmatches()*
|
||||||
Restores a list of matches saved by |getmatches()|. Returns 0
|
Restores a list of matches saved by |getmatches()|. Returns 0
|
||||||
if successful, otherwise -1. All current matches are cleared
|
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
|
also set the preferred column. Also see the "curswant" key in
|
||||||
|winrestview()|.
|
|winrestview()|.
|
||||||
|
|
||||||
|
setqflist({list} [, {action}[, {what}]]) *setqflist()*
|
||||||
setqflist({list} [, {action}]) *setqflist()*
|
|
||||||
Create or replace or add to the quickfix list using the items
|
Create or replace or add to the quickfix list using the items
|
||||||
in {list}. Each item in {list} is a dictionary.
|
in {list}. Each item in {list} is a dictionary.
|
||||||
Non-dictionary items in {list} are ignored. Each 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
|
If {action} is not present or is set to ' ', then a new list
|
||||||
is created.
|
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.
|
Returns zero for success, -1 for failure.
|
||||||
|
|
||||||
This function can be used to create a quickfix list
|
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
|
< Note that it's possible for patch 147 to be omitted even though 148 is
|
||||||
included.
|
included.
|
||||||
|
|
||||||
|
Hint: To find out if Vim supports backslashes in a file name (MS-Windows),
|
||||||
|
use: `if exists('+shellslash')`
|
||||||
|
|
||||||
|
|
||||||
acl Compiled with |ACL| support.
|
acl Compiled with |ACL| support.
|
||||||
all_builtin_terms Compiled with all builtin terminals enabled.
|
all_builtin_terms Compiled with all builtin terminals enabled.
|
||||||
amiga Amiga version of Vim.
|
amiga Amiga version of Vim.
|
||||||
|
@ -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_getftime(typval_T *argvars, typval_T *rettv);
|
||||||
static void f_getftype(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_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_getmatches(typval_T *argvars, typval_T *rettv);
|
||||||
static void f_getpid(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);
|
static void f_getcurpos(typval_T *argvars, typval_T *rettv);
|
||||||
@ -591,11 +592,11 @@ static struct fst
|
|||||||
{"getftime", 1, 1, f_getftime},
|
{"getftime", 1, 1, f_getftime},
|
||||||
{"getftype", 1, 1, f_getftype},
|
{"getftype", 1, 1, f_getftype},
|
||||||
{"getline", 1, 2, f_getline},
|
{"getline", 1, 2, f_getline},
|
||||||
{"getloclist", 1, 1, f_getqflist},
|
{"getloclist", 1, 2, f_getloclist},
|
||||||
{"getmatches", 0, 0, f_getmatches},
|
{"getmatches", 0, 0, f_getmatches},
|
||||||
{"getpid", 0, 0, f_getpid},
|
{"getpid", 0, 0, f_getpid},
|
||||||
{"getpos", 1, 1, f_getpos},
|
{"getpos", 1, 1, f_getpos},
|
||||||
{"getqflist", 0, 0, f_getqflist},
|
{"getqflist", 0, 1, f_getqflist},
|
||||||
{"getreg", 0, 3, f_getreg},
|
{"getreg", 0, 3, f_getreg},
|
||||||
{"getregtype", 0, 1, f_getregtype},
|
{"getregtype", 0, 1, f_getregtype},
|
||||||
{"gettabvar", 2, 3, f_gettabvar},
|
{"gettabvar", 2, 3, f_gettabvar},
|
||||||
@ -741,10 +742,10 @@ static struct fst
|
|||||||
{"setcmdpos", 1, 1, f_setcmdpos},
|
{"setcmdpos", 1, 1, f_setcmdpos},
|
||||||
{"setfperm", 2, 2, f_setfperm},
|
{"setfperm", 2, 2, f_setfperm},
|
||||||
{"setline", 2, 2, f_setline},
|
{"setline", 2, 2, f_setline},
|
||||||
{"setloclist", 2, 3, f_setloclist},
|
{"setloclist", 2, 4, f_setloclist},
|
||||||
{"setmatches", 1, 1, f_setmatches},
|
{"setmatches", 1, 1, f_setmatches},
|
||||||
{"setpos", 2, 2, f_setpos},
|
{"setpos", 2, 2, f_setpos},
|
||||||
{"setqflist", 1, 2, f_setqflist},
|
{"setqflist", 1, 3, f_setqflist},
|
||||||
{"setreg", 2, 3, f_setreg},
|
{"setreg", 2, 3, f_setreg},
|
||||||
{"settabvar", 3, 3, f_settabvar},
|
{"settabvar", 3, 3, f_settabvar},
|
||||||
{"settabwinvar", 4, 4, f_settabwinvar},
|
{"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);
|
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
|
* "getmatches()" function
|
||||||
*/
|
*/
|
||||||
@ -4666,28 +4712,13 @@ f_getpos(typval_T *argvars, typval_T *rettv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "getqflist()" and "getloclist()" functions
|
* "getqflist()" function
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
f_getqflist(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
|
f_getqflist(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_QUICKFIX
|
#ifdef FEAT_QUICKFIX
|
||||||
win_T *wp;
|
get_qf_loc_list(TRUE, NULL, &argvars[0], rettv);
|
||||||
#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);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9525,7 +9556,7 @@ f_setline(typval_T *argvars, typval_T *rettv)
|
|||||||
appended_lines_mark(lcount, added);
|
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
|
* Used by "setqflist()" and "setloclist()" functions
|
||||||
@ -9535,6 +9566,7 @@ set_qf_ll_list(
|
|||||||
win_T *wp UNUSED,
|
win_T *wp UNUSED,
|
||||||
typval_T *list_arg UNUSED,
|
typval_T *list_arg UNUSED,
|
||||||
typval_T *action_arg UNUSED,
|
typval_T *action_arg UNUSED,
|
||||||
|
typval_T *what_arg UNUSED,
|
||||||
typval_T *rettv)
|
typval_T *rettv)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_QUICKFIX
|
#ifdef FEAT_QUICKFIX
|
||||||
@ -9551,6 +9583,8 @@ set_qf_ll_list(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
list_T *l = list_arg->vval.v_list;
|
list_T *l = list_arg->vval.v_list;
|
||||||
|
dict_T *d = NULL;
|
||||||
|
int valid_dict = TRUE;
|
||||||
|
|
||||||
if (action_arg->v_type == VAR_STRING)
|
if (action_arg->v_type == VAR_STRING)
|
||||||
{
|
{
|
||||||
@ -9567,8 +9601,20 @@ set_qf_ll_list(
|
|||||||
else
|
else
|
||||||
EMSG(_(e_stringreq));
|
EMSG(_(e_stringreq));
|
||||||
|
|
||||||
if (l != NULL && action && set_errorlist(wp, l, action,
|
if (action_arg->v_type != VAR_UNKNOWN
|
||||||
(char_u *)(wp == NULL ? "setqflist()" : "setloclist()")) == OK)
|
&& 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;
|
rettv->vval.v_number = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -9586,7 +9632,7 @@ f_setloclist(typval_T *argvars, typval_T *rettv)
|
|||||||
|
|
||||||
win = find_win_by_nr(&argvars[0], NULL);
|
win = find_win_by_nr(&argvars[0], NULL);
|
||||||
if (win != 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
|
static void
|
||||||
f_setqflist(typval_T *argvars, typval_T *rettv)
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -27,8 +27,9 @@ void ex_cnext(exarg_T *eap);
|
|||||||
void ex_cfile(exarg_T *eap);
|
void ex_cfile(exarg_T *eap);
|
||||||
void ex_vimgrep(exarg_T *eap);
|
void ex_vimgrep(exarg_T *eap);
|
||||||
char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags);
|
char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags);
|
||||||
int get_errorlist(win_T *wp, list_T *list);
|
int get_errorlist_properties(win_T *wp, dict_T *what, dict_T *retdict);
|
||||||
int set_errorlist(win_T *wp, list_T *list, int action, char_u *title);
|
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_cbuffer(exarg_T *eap);
|
||||||
void ex_cexpr(exarg_T *eap);
|
void ex_cexpr(exarg_T *eap);
|
||||||
void ex_helpgrep(exarg_T *eap);
|
void ex_helpgrep(exarg_T *eap);
|
||||||
|
210
src/quickfix.c
210
src/quickfix.c
@ -3140,6 +3140,24 @@ qf_find_buf(qf_info_T *qi)
|
|||||||
return NULL;
|
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.
|
* 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;
|
buf_T *buf;
|
||||||
win_T *win;
|
win_T *win;
|
||||||
win_T *curwin_save;
|
|
||||||
aco_save_T aco;
|
aco_save_T aco;
|
||||||
|
|
||||||
/* Check if a buffer for the quickfix list exists. Update it. */
|
/* 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 */
|
/* set curwin/curbuf to buf and save a few things */
|
||||||
aucmd_prepbuf(&aco, buf);
|
aucmd_prepbuf(&aco, buf);
|
||||||
|
|
||||||
if ((win = qf_find_win(qi)) != NULL)
|
qf_update_win_titlevar(qi);
|
||||||
{
|
|
||||||
curwin_save = curwin;
|
|
||||||
curwin = win;
|
|
||||||
qf_set_title_var(qi);
|
|
||||||
curwin = curwin_save;
|
|
||||||
}
|
|
||||||
|
|
||||||
qf_fill_buffer(qi, buf, old_last);
|
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)
|
#if defined(FEAT_EVAL) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Add each quickfix error to list "list" as a dictionary.
|
* 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
|
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;
|
qf_info_T *qi = &ql_info;
|
||||||
dict_T *dict;
|
dict_T *dict;
|
||||||
@ -4550,12 +4562,15 @@ get_errorlist(win_T *wp, list_T *list)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qi->qf_curlist >= qi->qf_listcount
|
if (qf_idx == -1)
|
||||||
|| qi->qf_lists[qi->qf_curlist].qf_count == 0)
|
qf_idx = qi->qf_curlist;
|
||||||
|
|
||||||
|
if (qf_idx >= qi->qf_listcount
|
||||||
|
|| qi->qf_lists[qf_idx].qf_count == 0)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
qfp = qi->qf_lists[qi->qf_curlist].qf_start;
|
qfp = qi->qf_lists[qf_idx].qf_start;
|
||||||
for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ++i)
|
for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; ++i)
|
||||||
{
|
{
|
||||||
/* Handle entries with a non-existing buffer number. */
|
/* Handle entries with a non-existing buffer number. */
|
||||||
bufnum = qfp->qf_fnum;
|
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
|
* Flags used by getqflist()/getloclist() to determine which fields to return.
|
||||||
* of dictionaries. "title" will be copied to w:quickfix_title.
|
*/
|
||||||
* "action" is 'a' for add, 'r' for replace. Otherwise create a new list.
|
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
|
int
|
||||||
set_errorlist(
|
get_errorlist_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
||||||
win_T *wp,
|
{
|
||||||
list_T *list,
|
qf_info_T *qi = &ql_info;
|
||||||
int action,
|
int status = OK;
|
||||||
char_u *title)
|
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;
|
listitem_T *li;
|
||||||
dict_T *d;
|
dict_T *d;
|
||||||
@ -4613,16 +4705,8 @@ set_errorlist(
|
|||||||
#endif
|
#endif
|
||||||
int valid, status;
|
int valid, status;
|
||||||
int retval = OK;
|
int retval = OK;
|
||||||
qf_info_T *qi = &ql_info;
|
|
||||||
int did_bufnr_emsg = FALSE;
|
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)
|
if (action == ' ' || qi->qf_curlist == qi->qf_listcount)
|
||||||
/* make place for a new list */
|
/* make place for a new list */
|
||||||
qf_new_list(qi, title);
|
qf_new_list(qi, title);
|
||||||
@ -4719,6 +4803,74 @@ set_errorlist(
|
|||||||
|
|
||||||
return retval;
|
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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -916,7 +916,7 @@ do_tag(
|
|||||||
}
|
}
|
||||||
|
|
||||||
vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag);
|
vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag);
|
||||||
set_errorlist(curwin, list, ' ', IObuff);
|
set_errorlist(curwin, list, ' ', IObuff, NULL);
|
||||||
|
|
||||||
list_free(list);
|
list_free(list);
|
||||||
vim_free(fname);
|
vim_free(fname);
|
||||||
|
@ -1505,3 +1505,42 @@ func Test_duplicate_buf()
|
|||||||
|
|
||||||
call delete('Xgrepthis')
|
call delete('Xgrepthis')
|
||||||
endfunc
|
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
|
||||||
|
@ -763,6 +763,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2200,
|
||||||
/**/
|
/**/
|
||||||
2199,
|
2199,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user