changeset 9881:4b53f6be10c0 v7.4.2215

commit https://github.com/vim/vim/commit/386600f0cbcb8add099c723cf84634f46df2f788 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Aug 15 22:16:25 2016 +0200 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)
author Christian Brabandt <cb@256bit.org>
date Mon, 15 Aug 2016 22:30:06 +0200
parents d81d2a3adf1f
children 3174150dcb3b
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_bufwintabinfo.vim src/version.c
diffstat 4 files changed, 76 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -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.
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4027,7 +4027,7 @@ f_getbufinfo(typval_T *argvars, typval_T
     }
 
     /* 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
 #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
     }
 
     /* 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, shor
     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
     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
     /* 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++)
-    {
-	wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
-	winnr = 1;
-	for (; wp; wp = wp->w_next, winnr++)
-	{
+    FOR_ALL_TABPAGES(tp)
+    {
+	tabnr++;
+	winnr = 0;
+	FOR_ALL_WINDOWS_IN_TAB(tp, wp)
+	{
+	    winnr++;
 	    if (wparg != NULL && wp != wparg)
 		continue;
 	    d = get_win_info(wp, tabnr, winnr);
--- a/src/testdir/test_bufwintabinfo.vim
+++ b/src/testdir/test_bufwintabinfo.vim
@@ -14,6 +14,27 @@ 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
@@ -21,18 +42,42 @@ function Test_getbufwintabinfo()
     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
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2215,
+/**/
     2214,
 /**/
     2213,