aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/eval.txt5
-rw-r--r--src/nvim/eval.c8
-rw-r--r--src/nvim/eval.lua1
-rw-r--r--src/nvim/testdir/test_window_id.vim8
-rw-r--r--src/nvim/version.c2
-rw-r--r--src/nvim/window.c14
6 files changed, 37 insertions, 1 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index c95464c02a..d97a1400ce 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2148,6 +2148,7 @@ values({dict}) List values in {dict}
virtcol({expr}) Number screen column of cursor or mark
visualmode([expr]) String last visual mode used
wildmenumode() Number whether 'wildmenu' mode is active
+win_findbuf( {bufnr}) List find windows containing {bufnr}
win_getid( [{win} [, {tab}]]) Number get window ID for {win} in {tab}
win_gotoid( {expr}) Number go to window with ID {expr}
win_id2tabwin( {expr}) List get tab window nr from window ID
@@ -7234,6 +7235,10 @@ wildmenumode() *wildmenumode()*
(Note, this needs the 'wildcharm' option set appropriately).
+win_findbuf({bufnr}) *win_findbuf()*
+ Returns a list with window IDs for windows that contain buffer
+ {bufnr}. When there is none the list is empty.
+
win_getid([{win} [, {tab}]]) *win_getid()*
Get the window ID for the specified window.
When {win} is missing use the current window.
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index e441f96e7e..72b1807334 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -16768,6 +16768,14 @@ static void f_wildmenumode(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = 1;
}
+/// "win_findbuf()" function
+static void f_win_findbuf(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ if (rettv_list_alloc(rettv) != FAIL) {
+ win_findbuf(argvars, rettv->vval.v_list);
+ }
+}
+
/// "win_getid()" function
static void f_win_getid(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
index 9a3d73736f..3c371fc264 100644
--- a/src/nvim/eval.lua
+++ b/src/nvim/eval.lua
@@ -310,6 +310,7 @@ return {
virtcol={args=1},
visualmode={args={0, 1}},
wildmenumode={},
+ win_findbuf={args=1},
win_getid={args={0,2}},
win_gotoid={args=1},
win_id2tabwin={args=1},
diff --git a/src/nvim/testdir/test_window_id.vim b/src/nvim/testdir/test_window_id.vim
index b9e9f45c49..fa3ebd757e 100644
--- a/src/nvim/testdir/test_window_id.vim
+++ b/src/nvim/testdir/test_window_id.vim
@@ -5,6 +5,7 @@ func Test_win_getid()
let id1 = win_getid()
split two
let id2 = win_getid()
+ let bufnr2 = bufnr('%')
split three
let id3 = win_getid()
tabnew
@@ -12,6 +13,7 @@ func Test_win_getid()
let id4 = win_getid()
split five
let id5 = win_getid()
+ let bufnr5 = bufnr('%')
tabnext
wincmd w
@@ -67,5 +69,11 @@ func Test_win_getid()
call assert_equal([1, nr2], win_id2tabwin(id2))
call assert_equal([2, nr4], win_id2tabwin(id4))
+ call assert_equal([], win_findbuf(9999))
+ call assert_equal([id2], win_findbuf(bufnr2))
+ call win_gotoid(id5)
+ split
+ call assert_equal(sort([id5, win_getid()]), sort(win_findbuf(bufnr5)))
+
only!
endfunc
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 3f53391d74..403d1fa4f9 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -720,7 +720,7 @@ static int included_patches[] = {
// 1561 NA
// 1560 NA
// 1559,
- // 1558,
+ 1558,
1557,
// 1556 NA
// 1555 NA
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 2e97cb2c3e..386867a08f 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -5771,3 +5771,17 @@ int win_id2win(typval_T *argvars)
}
return 0;
}
+
+void win_findbuf(typval_T *argvars, list_T *list)
+{
+ int bufnr = get_tv_number(&argvars[0]);
+
+ for (tabpage_T *tp = first_tabpage; tp != NULL; tp = tp->tp_next) {
+ for (win_T *wp = tp == curtab ? firstwin : tp->tp_firstwin;
+ wp != NULL; wp = wp->w_next) {
+ if (wp->w_buffer->b_fnum == bufnr) {
+ list_append_number(list, wp->handle);
+ }
+ }
+ }
+}