]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 7.4.1895 v7.4.1895
authorBram Moolenaar <Bram@vim.org>
Sat, 4 Jun 2016 16:49:36 +0000 (18:49 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 4 Jun 2016 16:49:36 +0000 (18:49 +0200)
Problem:    Cannot use a window ID where a window number is expected.
Solution:   Add LOWEST_WIN_ID, so that the window ID can be used where a
            number is expected.

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

index 9cc854f93262cfa6adddb0efd254cc0bcc94c043..4cbece7a0786b689fc25815aab5f0d7832eea069 100644 (file)
@@ -2330,6 +2330,7 @@ arglistid([{winnr} [, {tabnr}]])
                With {winnr} only use this window in the current tab page.
                With {winnr} and {tabnr} use the window in the specified tab
                page.
+               {winnr} can be the window number or the window ID.
 
                                                        *argv()*
 argv([{nr}])   The result is the {nr}th file in the argument list of the
@@ -3987,6 +3988,7 @@ getcwd([{winnr} [, {tabnr}]])
                in the current tab page.
                With {winnr} and {tabnr} return the local current directory of
                the window in the specified tab page.
+               {winnr} can be the window number or the window ID.
                Return an empty string if the arguments are invalid.
 
 getfsize({fname})                                      *getfsize()*
@@ -4083,7 +4085,9 @@ getline({lnum} [, {end}])
 
 getloclist({nr})                                       *getloclist()*
                Returns a list with all the entries in the location list for
-               window {nr}. When {nr} is zero the current window is used.
+               window {nr}.  {nr} can be the window number or the window ID.
+               When {nr} is zero the current window is used.
+
                For a location list window, the displayed location list is
                returned.  For an invalid window number {nr}, an empty list is
                returned. Otherwise, same as |getqflist()|.
@@ -4217,6 +4221,7 @@ gettabwinvar({tabnr}, {winnr}, {varname} [, {def}])               *gettabwinvar()*
                Note that {varname} must be the name without "w:".
                Tabs are numbered starting with one.  For the current tabpage
                use |getwinvar()|.
+               {winnr} can be the window number or the window ID.
                When {winnr} is zero the current window is used.
                This also works for a global option, buffer-local option and
                window-local option, but it doesn't work for a global variable
@@ -4341,6 +4346,7 @@ haslocaldir([{winnr} [, {tabnr}]])                        *haslocaldir()*
                With {winnr} use this window in the current tab page.
                With {winnr} and {tabnr} use the window in the specified tab
                page.
+               {winnr} can be the window number or the window ID.
                Return 0 if the arguments are invalid.
 
 hasmapto({what} [, {mode} [, {abbr}]])                 *hasmapto()*
@@ -6287,9 +6293,11 @@ setline({lnum}, {text})                                  *setline()*
 
 setloclist({nr}, {list} [, {action}])                  *setloclist()*
                Create or replace or add to the location list for window {nr}.
-               When {nr} is zero the current window is used. For a location
-               list window, the displayed location list is modified.  For an
-               invalid window number {nr}, -1 is returned.
+               {nr} can be the window number or the window ID.
+               When {nr} is zero the current window is used.
+
+               For a location list window, the displayed location list is
+               modified.  For an invalid window number {nr}, -1 is returned.
                Otherwise, same as |setqflist()|.
                Also see |location-list|.
 
@@ -6456,6 +6464,7 @@ settabwinvar({tabnr}, {winnr}, {varname}, {val})  *settabwinvar()*
                {val}.
                Tabs are numbered starting with one.  For the current tabpage
                use |setwinvar()|.
+               {winnr} can be the window number or the window ID.
                When {winnr} is zero the current window is used.
                This also works for a global or local buffer option, but it
                doesn't work for a global or local buffer variable.
@@ -7528,9 +7537,11 @@ win_id2win({expr})                                       *win_id2win()*
 
                                                        *winbufnr()*
 winbufnr({nr}) The result is a Number, which is the number of the buffer
-               associated with window {nr}.  When {nr} is zero, the number of
-               the buffer in the current window is returned.  When window
-               {nr} doesn't exist, -1 is returned.
+               associated with window {nr}.  {nr} can be the window number or
+               the window ID.
+               When {nr} is zero, the number of the buffer in the current
+               window is returned.
+               When window {nr} doesn't exist, -1 is returned.
                Example: >
   :echo "The file in the current window is " . bufname(winbufnr(0))
 <
@@ -7541,6 +7552,7 @@ wincol()  The result is a Number, which is the virtual column of the
 
 winheight({nr})                                                *winheight()*
                The result is a Number, which is the height of window {nr}.
+               {nr} can be the window number or the window ID.
                When {nr} is zero, the height of the current window is
                returned.  When window {nr} doesn't exist, -1 is returned.
                An existing window always has a height of zero or more.
@@ -7620,6 +7632,7 @@ winsaveview()     Returns a |Dictionary| that contains information to restore
 
 winwidth({nr})                                         *winwidth()*
                The result is a Number, which is the width of window {nr}.
+               {nr} can be the window number or the window ID.
                When {nr} is zero, the width of the current window is
                returned.  When window {nr} doesn't exist, -1 is returned.
                An existing window always has a width of zero or more.
index 2a7a0906f95e63bbb1199e526b1931ae97947124..4825e8be8affe2462aaa793994a4b945beec4444 100644 (file)
@@ -13566,11 +13566,18 @@ find_win_by_nr(
 
     for (wp = (tp == NULL || tp == curtab) ? firstwin : tp->tp_firstwin;
                                                  wp != NULL; wp = wp->w_next)
-       if (--nr <= 0)
+       if (nr >= LOWEST_WIN_ID)
+       {
+           if (wp->w_id == nr)
+               return wp;
+       }
+       else if (--nr <= 0)
            break;
+    if (nr >= LOWEST_WIN_ID)
+       return NULL;
     return wp;
 #else
-    if (nr == 0 || nr == 1)
+    if (nr == 0 || nr == 1 || nr == curwin->w_id)
        return curwin;
     return NULL;
 #endif
index fa3ebd757e22923ef6861fc897ad84b66521102c..66656e1d0a9c943c6e9453aab69fa48c72563a2a 100644 (file)
@@ -3,17 +3,22 @@
 func Test_win_getid()
   edit one
   let id1 = win_getid()
+  let w:one = 'one'
   split two
   let id2 = win_getid()
   let bufnr2 = bufnr('%')
+  let w:two = 'two'
   split three
   let id3 = win_getid()
+  let w:three = 'three'
   tabnew
   edit four
   let id4 = win_getid()
+  let w:four = 'four'
   split five
   let id5 = win_getid()
   let bufnr5 = bufnr('%')
+  let w:five = 'five'
   tabnext
 
   wincmd w
@@ -28,6 +33,9 @@ func Test_win_getid()
   call assert_equal("three", expand("%"))
   call assert_equal(id3, win_getid())
   let nr3 = winnr()
+  call assert_equal('one', getwinvar(id1, 'one'))
+  call assert_equal('two', getwinvar(id2, 'two'))
+  call assert_equal('three', getwinvar(id3, 'three'))
   tabnext
   call assert_equal("five", expand("%"))
   call assert_equal(id5, win_getid())
@@ -36,7 +44,14 @@ func Test_win_getid()
   call assert_equal("four", expand("%"))
   call assert_equal(id4, win_getid())
   let nr4 = winnr()
+  call assert_equal('four', getwinvar(id4, 'four'))
+  call assert_equal('five', getwinvar(id5, 'five'))
+  call settabwinvar(1, id2, 'two', '2')
+  call setwinvar(id4, 'four', '4')
   tabnext
+  call assert_equal('4', gettabwinvar(2, id4, 'four'))
+  call assert_equal('five', gettabwinvar(2, id5, 'five'))
+  call assert_equal('2', getwinvar(id2, 'two'))
 
   exe nr1 . "wincmd w"
   call assert_equal(id1, win_getid())
index b83cb332364eab6149d640edcbf6129530388d81..1e7c2f290d6a1229c74b7ee3bfe073d5288a900d 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1895,
 /**/
     1894,
 /**/
index fb991dcfa4899a658ef65b722acb30e4cd2f42dd..d573cea1ff2bbd0fdab743d4442b1a2cb8a81403 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -2334,4 +2334,7 @@ int vim_main2(int argc, char **argv);
 #define DIP_OPT            0x10        /* also use "opt" directory in 'packpath' */
 #define DIP_NORTP   0x20       /* do not use 'runtimepath' */
 
+/* Lowest number used for window ID. Cannot have this many windows. */
+#define LOWEST_WIN_ID 1000
+
 #endif /* VIM__H */
index 01da765b46bb1e87cfe0f1056e575f3499b436c1..2dc255467262c2001329329deeb44ca0b8592cab 100644 (file)
@@ -4422,7 +4422,7 @@ buf_jump_open_tab(buf_T *buf)
 }
 #endif
 
-static int last_win_id = 0;
+static int last_win_id = LOWEST_WIN_ID - 1;
 
 /*
  * Allocate a window structure and link it in the window list when "hidden" is