# HG changeset patch # User Christian Brabandt # Date 1471293006 -7200 # Node ID 4b53f6be10c00d670bb37a3ef8c4f22460b9de70 # Parent d81d2a3adf1f0198a58629d89925364464a05d7a commit https://github.com/vim/vim/commit/386600f0cbcb8add099c723cf84634f46df2f788 Author: Bram Moolenaar 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) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- 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. diff --git a/src/evalfunc.c b/src/evalfunc.c --- 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); diff --git a/src/testdir/test_bufwintabinfo.vim b/src/testdir/test_bufwintabinfo.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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,