]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 7.4.1558 v7.4.1558
authorBram Moolenaar <Bram@vim.org>
Sun, 13 Mar 2016 18:04:51 +0000 (19:04 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 13 Mar 2016 18:04:51 +0000 (19:04 +0100)
Problem:    It is not easy to find out what windows display a buffer.
Solution:   Add win_findbuf().

runtime/doc/eval.txt
src/eval.c
src/proto/window.pro
src/testdir/test_window_id.vim
src/version.c
src/window.c

index 6e18df45f8660c5580686733614078e2b7c57d7c..14607310c309493ff2fb1f3d0a7a1b97a4c140e3 100644 (file)
@@ -2149,6 +2149,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 and window nr from window ID
@@ -7176,6 +7177,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.
index 5025a52c1978786c14556fccbaad8538a1327380..e045a67530b55fbf7a51797cd01546fac3f71e07 100644 (file)
@@ -807,6 +807,7 @@ static void f_values(typval_T *argvars, typval_T *rettv);
 static void f_virtcol(typval_T *argvars, typval_T *rettv);
 static void f_visualmode(typval_T *argvars, typval_T *rettv);
 static void f_wildmenumode(typval_T *argvars, typval_T *rettv);
+static void f_win_findbuf(typval_T *argvars, typval_T *rettv);
 static void f_win_getid(typval_T *argvars, typval_T *rettv);
 static void f_win_gotoid(typval_T *argvars, typval_T *rettv);
 static void f_win_id2tabwin(typval_T *argvars, typval_T *rettv);
@@ -8388,6 +8389,7 @@ static struct fst
     {"virtcol",                1, 1, f_virtcol},
     {"visualmode",     0, 1, f_visualmode},
     {"wildmenumode",   0, 0, f_wildmenumode},
+    {"win_findbuf",    1, 1, f_win_findbuf},
     {"win_getid",      0, 2, f_win_getid},
     {"win_gotoid",     1, 1, f_win_gotoid},
     {"win_id2tabwin",  1, 1, f_win_id2tabwin},
@@ -12668,6 +12670,16 @@ f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv)
 #endif
 }
 
+/*
+ * "win_findbuf()" function
+ */
+    static void
+f_win_findbuf(typval_T *argvars, typval_T *rettv)
+{
+    if (rettv_list_alloc(rettv) != FAIL)
+       win_findbuf(argvars, rettv->vval.v_list);
+}
+
 /*
  * "win_getid()" function
  */
index 3c511e3c54e9956396a519c7ca639b135c32e50e..05b6b9daebb289c68ebbd48ce3153eaeb3928f19 100644 (file)
@@ -87,4 +87,5 @@ int win_getid(typval_T *argvars);
 int win_gotoid(typval_T *argvars);
 void win_id2tabwin(typval_T *argvars, list_T *list);
 int win_id2win(typval_T *argvars);
+void win_findbuf(typval_T *argvars, list_T *list);
 /* vim: set ft=c : */
index b9e9f45c49fdbb07baef257eb0359a89f5051dfd..fa3ebd757e22923ef6861fc897ad84b66521102c 100644 (file)
@@ -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
index bed7a460420c2b5e4ca55b33fee7ccc35cc736d3..ac23c50fe44e6655d8229a536c5510c9318fa749 100644 (file)
@@ -743,6 +743,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1558,
 /**/
     1557,
 /**/
index b6111bd15cda60a885fd220de8cf27de4da0b638..c6a6d2b84fe800009dcf66622893569801502370 100644 (file)
@@ -7297,4 +7297,19 @@ win_id2win(typval_T *argvars)
     }
     return 0;
 }
+
+    void
+win_findbuf(typval_T *argvars, list_T *list)
+{
+    win_T      *wp;
+    tabpage_T   *tp;
+    int                bufnr = get_tv_number(&argvars[0]);
+
+    for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+       for (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->w_id);
+}
+
 #endif