Skip to content

Commit 9cdf86b

Browse files
committed
patch 7.4.1558
Problem: It is not easy to find out what windows display a buffer. Solution: Add win_findbuf().
1 parent 86edef6 commit 9cdf86b

6 files changed

Lines changed: 43 additions & 0 deletions

File tree

runtime/doc/eval.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,6 +2149,7 @@ values( {dict}) List values in {dict}
21492149
virtcol( {expr}) Number screen column of cursor or mark
21502150
visualmode( [expr]) String last visual mode used
21512151
wildmenumode() Number whether 'wildmenu' mode is active
2152+
win_findbuf( {bufnr}) List find windows containing {bufnr}
21522153
win_getid( [{win} [, {tab}]]) Number get window ID for {win} in {tab}
21532154
win_gotoid( {expr}) Number go to window with ID {expr}
21542155
win_id2tabwin( {expr}) List get tab and window nr from window ID
@@ -7176,6 +7177,10 @@ wildmenumode() *wildmenumode()*
71767177
(Note, this needs the 'wildcharm' option set appropriately).
71777178

71787179

7180+
win_findbuf({bufnr}) *win_findbuf()*
7181+
Returns a list with window IDs for windows that contain buffer
7182+
{bufnr}. When there is none the list is empty.
7183+
71797184
win_getid([{win} [, {tab}]]) *win_getid()*
71807185
Get the window ID for the specified window.
71817186
When {win} is missing use the current window.

src/eval.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,7 @@ static void f_values(typval_T *argvars, typval_T *rettv);
807807
static void f_virtcol(typval_T *argvars, typval_T *rettv);
808808
static void f_visualmode(typval_T *argvars, typval_T *rettv);
809809
static void f_wildmenumode(typval_T *argvars, typval_T *rettv);
810+
static void f_win_findbuf(typval_T *argvars, typval_T *rettv);
810811
static void f_win_getid(typval_T *argvars, typval_T *rettv);
811812
static void f_win_gotoid(typval_T *argvars, typval_T *rettv);
812813
static void f_win_id2tabwin(typval_T *argvars, typval_T *rettv);
@@ -8388,6 +8389,7 @@ static struct fst
83888389
{"virtcol", 1, 1, f_virtcol},
83898390
{"visualmode", 0, 1, f_visualmode},
83908391
{"wildmenumode", 0, 0, f_wildmenumode},
8392+
{"win_findbuf", 1, 1, f_win_findbuf},
83918393
{"win_getid", 0, 2, f_win_getid},
83928394
{"win_gotoid", 1, 1, f_win_gotoid},
83938395
{"win_id2tabwin", 1, 1, f_win_id2tabwin},
@@ -12668,6 +12670,16 @@ f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv)
1266812670
#endif
1266912671
}
1267012672

12673+
/*
12674+
* "win_findbuf()" function
12675+
*/
12676+
static void
12677+
f_win_findbuf(typval_T *argvars, typval_T *rettv)
12678+
{
12679+
if (rettv_list_alloc(rettv) != FAIL)
12680+
win_findbuf(argvars, rettv->vval.v_list);
12681+
}
12682+
1267112683
/*
1267212684
* "win_getid()" function
1267312685
*/

src/proto/window.pro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,5 @@ int win_getid(typval_T *argvars);
8787
int win_gotoid(typval_T *argvars);
8888
void win_id2tabwin(typval_T *argvars, list_T *list);
8989
int win_id2win(typval_T *argvars);
90+
void win_findbuf(typval_T *argvars, list_T *list);
9091
/* vim: set ft=c : */

src/testdir/test_window_id.vim

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ func Test_win_getid()
55
let id1 = win_getid()
66
split two
77
let id2 = win_getid()
8+
let bufnr2 = bufnr('%')
89
split three
910
let id3 = win_getid()
1011
tabnew
1112
edit four
1213
let id4 = win_getid()
1314
split five
1415
let id5 = win_getid()
16+
let bufnr5 = bufnr('%')
1517
tabnext
1618

1719
wincmd w
@@ -67,5 +69,11 @@ func Test_win_getid()
6769
call assert_equal([1, nr2], win_id2tabwin(id2))
6870
call assert_equal([2, nr4], win_id2tabwin(id4))
6971

72+
call assert_equal([], win_findbuf(9999))
73+
call assert_equal([id2], win_findbuf(bufnr2))
74+
call win_gotoid(id5)
75+
split
76+
call assert_equal(sort([id5, win_getid()]), sort(win_findbuf(bufnr5)))
77+
7078
only!
7179
endfunc

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,8 @@ static char *(features[]) =
743743

744744
static int included_patches[] =
745745
{ /* Add new patch number below this line */
746+
/**/
747+
1558,
746748
/**/
747749
1557,
748750
/**/

src/window.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7297,4 +7297,19 @@ win_id2win(typval_T *argvars)
72977297
}
72987298
return 0;
72997299
}
7300+
7301+
void
7302+
win_findbuf(typval_T *argvars, list_T *list)
7303+
{
7304+
win_T *wp;
7305+
tabpage_T *tp;
7306+
int bufnr = get_tv_number(&argvars[0]);
7307+
7308+
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
7309+
for (wp = tp == curtab ? firstwin : tp->tp_firstwin;
7310+
wp != NULL; wp = wp->w_next)
7311+
if (wp->w_buffer->b_fnum == bufnr)
7312+
list_append_number(list, wp->w_id);
7313+
}
7314+
73007315
#endif

0 commit comments

Comments
 (0)