summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.1140
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.1140')
-rw-r--r--data/vim/patches/8.1.1140408
1 files changed, 408 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1140 b/data/vim/patches/8.1.1140
new file mode 100644
index 000000000..bb8f23751
--- /dev/null
+++ b/data/vim/patches/8.1.1140
@@ -0,0 +1,408 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.1140
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.1140
+Problem: Not easy to find out what neighbors a window has.
+Solution: Add more arguments to winnr(). (Yegappan Lakshmanan, closes #3993)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/window.pro,
+ src/testdir/test_window_cmd.vim, src/window.c
+
+
+*** ../vim-8.1.1139/runtime/doc/eval.txt 2019-04-06 13:18:06.733335092 +0200
+--- runtime/doc/eval.txt 2019-04-08 19:56:34.570615478 +0200
+***************
+*** 10139,10155 ****
+ *winnr()*
+ winnr([{arg}]) The result is a Number, which is the number of the current
+ window. The top window has number 1.
+! When the optional argument is "$", the number of the
+! last window is returned (the window count). >
+! let window_count = winnr('$')
+! < When the optional argument is "#", the number of the last
+! accessed window is returned (where |CTRL-W_p| goes to).
+! If there is no previous window or it is in another tab page 0
+! is returned.
+ The number can be used with |CTRL-W_w| and ":wincmd w"
+ |:wincmd|.
+ Also see |tabpagewinnr()| and |win_getid()|.
+!
+ *winrestcmd()*
+ winrestcmd() Returns a sequence of |:resize| commands that should restore
+ the current window sizes. Only works properly when no windows
+--- 10198,10227 ----
+ *winnr()*
+ winnr([{arg}]) The result is a Number, which is the number of the current
+ window. The top window has number 1.
+!
+! The optional argument {arg} supports the following values:
+! $ the number of the last window (the window
+! count).
+! # the number of the last accessed window (where
+! |CTRL-W_p| goes to). If there is no previous
+! window or it is in another tab page 0 is
+! returned.
+! {N}j the number of the Nth window below the
+! current window (where |CTRL-W_j| goes to).
+! {N}k the number of the Nth window above the current
+! window (where |CTRL-W_k| goes to).
+! {N}h the number of the Nth window left of the
+! current window (where |CTRL-W_h| goes to).
+! {N}l the number of the Nth window right of the
+! current window (where |CTRL-W_l| goes to).
+ The number can be used with |CTRL-W_w| and ":wincmd w"
+ |:wincmd|.
+ Also see |tabpagewinnr()| and |win_getid()|.
+! Examples: >
+! let window_count = winnr('$')
+! let prev_window = winnr('#')
+! let wnum = winnr('3k')
+! <
+ *winrestcmd()*
+ winrestcmd() Returns a sequence of |:resize| commands that should restore
+ the current window sizes. Only works properly when no windows
+*** ../vim-8.1.1139/src/evalfunc.c 2019-04-07 14:21:26.230339328 +0200
+--- src/evalfunc.c 2019-04-08 19:53:26.131435229 +0200
+***************
+*** 13982,13987 ****
+--- 13982,13989 ----
+ twin = (tp == curtab) ? curwin : tp->tp_curwin;
+ if (argvar->v_type != VAR_UNKNOWN)
+ {
++ int invalid_arg = FALSE;
++
+ arg = tv_get_string_chk(argvar);
+ if (arg == NULL)
+ nr = 0; /* type error; errmsg already given */
+***************
+*** 13995,14000 ****
+--- 13997,14028 ----
+ }
+ else
+ {
++ long count;
++ char_u *endp;
++
++ // Extract the window count (if specified). e.g. winnr('3j')
++ count = strtol((char *)arg, (char **)&endp, 10);
++ if (count <= 0)
++ count = 1; // if count is not specified, default to 1
++ if (endp != NULL && *endp != '\0')
++ {
++ if (STRCMP(endp, "j") == 0)
++ twin = win_vert_neighbor(tp, twin, FALSE, count);
++ else if (STRCMP(endp, "k") == 0)
++ twin = win_vert_neighbor(tp, twin, TRUE, count);
++ else if (STRCMP(endp, "h") == 0)
++ twin = win_horz_neighbor(tp, twin, TRUE, count);
++ else if (STRCMP(endp, "l") == 0)
++ twin = win_horz_neighbor(tp, twin, FALSE, count);
++ else
++ invalid_arg = TRUE;
++ }
++ else
++ invalid_arg = TRUE;
++ }
++
++ if (invalid_arg)
++ {
+ semsg(_(e_invexpr2), arg);
+ nr = 0;
+ }
+*** ../vim-8.1.1139/src/proto/window.pro 2019-02-13 22:45:21.512636158 +0100
+--- src/proto/window.pro 2019-04-08 19:53:26.131435229 +0200
+***************
+*** 37,42 ****
+--- 37,44 ----
+ void win_goto(win_T *wp);
+ win_T *win_find_nr(int winnr);
+ tabpage_T *win_find_tabpage(win_T *win);
++ win_T *win_vert_neighbor(tabpage_T *tp, win_T *wp, int up, long count);
++ win_T *win_horz_neighbor(tabpage_T *tp, win_T * wp, int left, long count);
+ void win_enter(win_T *wp, int undo_sync);
+ win_T *buf_jump_open_win(buf_T *buf);
+ win_T *buf_jump_open_tab(buf_T *buf);
+*** ../vim-8.1.1139/src/testdir/test_window_cmd.vim 2019-03-04 13:18:15.977053527 +0100
+--- src/testdir/test_window_cmd.vim 2019-04-08 19:53:26.131435229 +0200
+***************
+*** 743,746 ****
+--- 743,791 ----
+ let &so = so_save
+ endfunc
+
++ " Tests for the winnr() function
++ func Test_winnr()
++ only | tabonly
++ call assert_equal(1, winnr('j'))
++ call assert_equal(1, winnr('k'))
++ call assert_equal(1, winnr('h'))
++ call assert_equal(1, winnr('l'))
++
++ " create a set of horizontally and vertically split windows
++ leftabove new | wincmd p
++ leftabove new | wincmd p
++ rightbelow new | wincmd p
++ rightbelow new | wincmd p
++ leftabove vnew | wincmd p
++ leftabove vnew | wincmd p
++ rightbelow vnew | wincmd p
++ rightbelow vnew | wincmd p
++
++ call assert_equal(8, winnr('j'))
++ call assert_equal(2, winnr('k'))
++ call assert_equal(4, winnr('h'))
++ call assert_equal(6, winnr('l'))
++ call assert_equal(9, winnr('2j'))
++ call assert_equal(1, winnr('2k'))
++ call assert_equal(3, winnr('2h'))
++ call assert_equal(7, winnr('2l'))
++
++ " Error cases
++ call assert_fails("echo winnr('0.2k')", 'E15:')
++ call assert_equal(2, winnr('-2k'))
++ call assert_fails("echo winnr('-2xj')", 'E15:')
++ call assert_fails("echo winnr('j2j')", 'E15:')
++ call assert_fails("echo winnr('ll')", 'E15:')
++ call assert_fails("echo winnr('5')", 'E15:')
++ call assert_equal(4, winnr('0h'))
++
++ tabnew
++ call assert_equal(8, tabpagewinnr(1, 'j'))
++ call assert_equal(2, tabpagewinnr(1, 'k'))
++ call assert_equal(4, tabpagewinnr(1, 'h'))
++ call assert_equal(6, tabpagewinnr(1, 'l'))
++
++ only | tabonly
++ endfunc
++
+ " vim: shiftwidth=2 sts=2 expandtab
+*** ../vim-8.1.1139/src/window.c 2019-03-30 19:49:03.262806533 +0100
+--- src/window.c 2019-04-08 19:58:55.705969739 +0200
+***************
+*** 4218,4235 ****
+ #endif
+
+ /*
+! * Move to window above or below "count" times.
+ */
+! static void
+! win_goto_ver(
+! int up, /* TRUE to go to win above */
+! long count)
+ {
+ frame_T *fr;
+ frame_T *nfr;
+ frame_T *foundfr;
+
+! foundfr = curwin->w_frame;
+ while (count--)
+ {
+ /*
+--- 4218,4236 ----
+ #endif
+
+ /*
+! * Get the above or below neighbor window of the specified window.
+! * up - TRUE for the above neighbor
+! * count - nth neighbor window
+! * Returns the specified window if the neighbor is not found.
+ */
+! win_T *
+! win_vert_neighbor(tabpage_T *tp, win_T *wp, int up, long count)
+ {
+ frame_T *fr;
+ frame_T *nfr;
+ frame_T *foundfr;
+
+! foundfr = wp->w_frame;
+ while (count--)
+ {
+ /*
+***************
+*** 4239,4245 ****
+ fr = foundfr;
+ for (;;)
+ {
+! if (fr == topframe)
+ goto end;
+ if (up)
+ nfr = fr->fr_prev;
+--- 4240,4246 ----
+ fr = foundfr;
+ for (;;)
+ {
+! if (fr == tp->tp_topframe)
+ goto end;
+ if (up)
+ nfr = fr->fr_prev;
+***************
+*** 4266,4272 ****
+ /* Find the frame at the cursor row. */
+ while (fr->fr_next != NULL
+ && frame2win(fr)->w_wincol + fr->fr_width
+! <= curwin->w_wincol + curwin->w_wcol)
+ fr = fr->fr_next;
+ }
+ if (nfr->fr_layout == FR_COL && up)
+--- 4267,4273 ----
+ /* Find the frame at the cursor row. */
+ while (fr->fr_next != NULL
+ && frame2win(fr)->w_wincol + fr->fr_width
+! <= wp->w_wincol + wp->w_wcol)
+ fr = fr->fr_next;
+ }
+ if (nfr->fr_layout == FR_COL && up)
+***************
+*** 4276,4298 ****
+ }
+ }
+ end:
+! if (foundfr != NULL)
+! win_goto(foundfr->fr_win);
+ }
+
+ /*
+! * Move to left or right window.
+ */
+ static void
+! win_goto_hor(
+! int left, /* TRUE to go to left win */
+ long count)
+ {
+ frame_T *fr;
+ frame_T *nfr;
+ frame_T *foundfr;
+
+! foundfr = curwin->w_frame;
+ while (count--)
+ {
+ /*
+--- 4277,4314 ----
+ }
+ }
+ end:
+! return foundfr != NULL ? foundfr->fr_win : NULL;
+ }
+
+ /*
+! * Move to window above or below "count" times.
+ */
+ static void
+! win_goto_ver(
+! int up, // TRUE to go to win above
+ long count)
+ {
++ win_T *win;
++
++ win = win_vert_neighbor(curtab, curwin, up, count);
++ if (win != NULL)
++ win_goto(win);
++ }
++
++ /*
++ * Get the left or right neighbor window of the specified window.
++ * left - TRUE for the left neighbor
++ * count - nth neighbor window
++ * Returns the specified window if the neighbor is not found.
++ */
++ win_T *
++ win_horz_neighbor(tabpage_T *tp, win_T * wp, int left, long count)
++ {
+ frame_T *fr;
+ frame_T *nfr;
+ frame_T *foundfr;
+
+! foundfr = wp->w_frame;
+ while (count--)
+ {
+ /*
+***************
+*** 4302,4308 ****
+ fr = foundfr;
+ for (;;)
+ {
+! if (fr == topframe)
+ goto end;
+ if (left)
+ nfr = fr->fr_prev;
+--- 4318,4324 ----
+ fr = foundfr;
+ for (;;)
+ {
+! if (fr == tp->tp_topframe)
+ goto end;
+ if (left)
+ nfr = fr->fr_prev;
+***************
+*** 4329,4335 ****
+ /* Find the frame at the cursor row. */
+ while (fr->fr_next != NULL
+ && frame2win(fr)->w_winrow + fr->fr_height
+! <= curwin->w_winrow + curwin->w_wrow)
+ fr = fr->fr_next;
+ }
+ if (nfr->fr_layout == FR_ROW && left)
+--- 4345,4351 ----
+ /* Find the frame at the cursor row. */
+ while (fr->fr_next != NULL
+ && frame2win(fr)->w_winrow + fr->fr_height
+! <= wp->w_winrow + wp->w_wrow)
+ fr = fr->fr_next;
+ }
+ if (nfr->fr_layout == FR_ROW && left)
+***************
+*** 4339,4346 ****
+ }
+ }
+ end:
+! if (foundfr != NULL)
+! win_goto(foundfr->fr_win);
+ }
+
+ /*
+--- 4355,4376 ----
+ }
+ }
+ end:
+! return foundfr != NULL ? foundfr->fr_win : NULL;
+! }
+!
+! /*
+! * Move to left or right window.
+! */
+! static void
+! win_goto_hor(
+! int left, // TRUE to go to left win
+! long count)
+! {
+! win_T *win;
+!
+! win = win_horz_neighbor(curtab, curwin, left, count);
+! if (win != NULL)
+! win_goto(win);
+ }
+
+ /*
+*** ../vim-8.1.1139/src/version.c 2019-04-08 18:59:50.973019097 +0200
+--- src/version.c 2019-04-08 20:00:11.881612574 +0200
+***************
+*** 773,774 ****
+--- 773,776 ----
+ { /* Add new patch number below this line */
++ /**/
++ 1140,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+232. You start conversations with, "Have you gotten an ISDN line?"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///