Permalink
Browse files

patch 7.4.2215

Problem:    It's not easy to find out if a window is a quickfix or location
            list window.
Solution:   Add "loclist" and "quickfix" entries to the dict returnec by
            getwininfo(). (Yegappan Lakshmanan)
  • Loading branch information...
1 parent 16350cb commit 386600f0cbcb8add099c723cf84634f46df2f788 @brammool brammool committed Aug 15, 2016
Showing with 73 additions and 17 deletions.
  1. +10 −8 runtime/doc/eval.txt
  2. +16 −9 src/evalfunc.c
  3. +45 −0 src/testdir/test_bufwintabinfo.vim
  4. +2 −0 src/version.c
View
@@ -4584,14 +4584,16 @@ getwininfo([{winid}]) *getwininfo()*
pages is returned.
Each List item is a Dictionary with the following entries:
- nr window number.
- tpnr tab page number.
- winid window ID.
- height window height.
- width window width.
- bufnum number of buffer in the window.
- options dictionary of window local options.
- variables dictionary of window local variables.
+ bufnum number of buffer in the window
+ height window height
+ loclist 1 if showing a location list
+ nr window number
+ options dictionary of window local options
+ quickfix 1 if quickfix or location list window
+ tpnr tab page number
+ variables dictionary of window local variables
+ width window width
+ winid window ID
getwinvar({winnr}, {varname} [, {def}]) *getwinvar()*
Like |gettabwinvar()| for the current tabpage.
View
@@ -4027,7 +4027,7 @@ f_getbufinfo(typval_T *argvars, typval_T *rettv)
}
/* Return information about all the buffers or a specified buffer */
- for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+ FOR_ALL_BUFFERS(buf)
{
if (argbuf != NULL && argbuf != buf)
continue;
@@ -5030,7 +5030,7 @@ f_gettabinfo(typval_T *argvars, typval_T *rettv)
#ifdef FEAT_WINDOWS
tabpage_T *tp, *tparg = NULL;
dict_T *d;
- int tpnr = 1;
+ int tpnr = 0;
if (rettv_list_alloc(rettv) != OK)
return;
@@ -5044,8 +5044,9 @@ f_gettabinfo(typval_T *argvars, typval_T *rettv)
}
/* Get information about a specific tab page or all tab pages */
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next, tpnr++)
+ FOR_ALL_TABPAGES(tp)
{
+ tpnr++;
if (tparg != NULL && tp != tparg)
continue;
d = get_tabpage_info(tp, tpnr);
@@ -5131,6 +5132,12 @@ get_win_info(win_T *wp, short tpnr, short winnr)
dict_add_nr_str(dict, "width", wp->w_width, NULL);
dict_add_nr_str(dict, "bufnum", wp->w_buffer->b_fnum, NULL);
+#ifdef FEAT_QUICKFIX
+ dict_add_nr_str(dict, "quickfix", bt_quickfix(wp->w_buffer), NULL);
+ dict_add_nr_str(dict, "loclist",
+ (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL), NULL);
+#endif
+
/* Copy window variables */
vars = dict_copy(wp->w_vars, TRUE, 0);
if (vars != NULL)
@@ -5155,7 +5162,7 @@ f_getwininfo(typval_T *argvars, typval_T *rettv)
tabpage_T *tp;
win_T *wp = NULL, *wparg = NULL;
dict_T *d;
- short tabnr, winnr;
+ short tabnr = 0, winnr;
#endif
if (rettv_list_alloc(rettv) != OK)
@@ -5172,13 +5179,13 @@ f_getwininfo(typval_T *argvars, typval_T *rettv)
/* Collect information about either all the windows across all the tab
* pages or one particular window.
*/
- tabnr = 1;
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next, tabnr++)
+ FOR_ALL_TABPAGES(tp)
{
- wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
- winnr = 1;
- for (; wp; wp = wp->w_next, winnr++)
+ tabnr++;
+ winnr = 0;
+ FOR_ALL_WINDOWS_IN_TAB(tp, wp)
{
+ winnr++;
if (wparg != NULL && wp != wparg)
continue;
d = get_win_info(wp, tabnr, winnr);
@@ -14,25 +14,70 @@ function Test_getbufwintabinfo()
hide enew
call assert_equal(3, len(getbufinfo({'bufloaded':1})))
+ set tabstop&vim
+ let b:editor = 'vim'
+ let l = getbufinfo('%')
+ call assert_equal(bufnr('%'), l[0].nr)
+ call assert_equal(8, l[0].options.tabstop)
+ call assert_equal('vim', l[0].variables.editor)
+ call assert_notequal(-1, index(l[0].windows, bufwinid('%')))
+
+ if has('signs')
+ call append(0, ['Linux', 'Windows', 'Mac'])
+ sign define Mark text=>> texthl=Search
+ exe "sign place 2 line=3 name=Mark buffer=" . bufnr('%')
+ let l = getbufinfo('%')
+ call assert_equal(2, l[0].signs[0].id)
+ call assert_equal(3, l[0].signs[0].lnum)
+ call assert_equal('Mark', l[0].signs[0].name)
+ sign unplace *
+ sign undefine Mark
+ enew!
+ endif
+
only
let w1_id = win_getid()
new
let w2_id = win_getid()
tabnew | let w3_id = win_getid()
new | let w4_id = win_getid()
new | let w5_id = win_getid()
+ call setwinvar(0, 'signal', 'green')
tabfirst
let winlist = getwininfo()
call assert_equal(5, len(winlist))
+ call assert_equal(winbufnr(2), winlist[1].bufnum)
+ call assert_equal(winheight(2), winlist[1].height)
+ call assert_equal(1, winlist[2].nr)
+ call assert_equal('auto', winlist[0].options.signcolumn)
call assert_equal(2, winlist[3].tpnr)
+ call assert_equal('green', winlist[2].variables.signal)
+ call assert_equal(winwidth(1), winlist[0].width)
+ call assert_equal(w4_id, winlist[3].winid)
let winfo = getwininfo(w5_id)[0]
call assert_equal(2, winfo.tpnr)
call assert_equal([], getwininfo(3))
+ call settabvar(1, 'space', 'build')
let tablist = gettabinfo()
call assert_equal(2, len(tablist))
call assert_equal(3, len(tablist[1].windows))
+ call assert_equal(2, tablist[1].nr)
+ call assert_equal('build', tablist[0].variables.space)
+ call assert_equal(w2_id, tablist[0].windows[0])
call assert_equal([], gettabinfo(3))
tabonly | only
+
+ lexpr ''
+ lopen
+ copen
+ let winlist = getwininfo()
+ call assert_false(winlist[0].quickfix)
+ call assert_false(winlist[0].loclist)
+ call assert_true(winlist[1].quickfix)
+ call assert_true(winlist[1].loclist)
+ call assert_true(winlist[2].quickfix)
+ call assert_false(winlist[2].loclist)
+ wincmd t | only
endfunction
View
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2215,
+/**/
2214,
/**/
2213,

0 comments on commit 386600f

Please sign in to comment.