diff options
author | Sam Bingner <sam@bingner.com> | 2018-12-13 15:11:52 -1000 |
---|---|---|
committer | Sam Bingner <sam@bingner.com> | 2018-12-13 15:11:52 -1000 |
commit | 957aa75d05c00731d7112bed7b68ce4568667d0c (patch) | |
tree | 0445216818495a7864eaa3acde1a1570d34b958d /data/vim/patches/8.1.0307 | |
parent | c54a909c8b5a8519130803cf55f68603c0ad3682 (diff) |
Update vim
Diffstat (limited to 'data/vim/patches/8.1.0307')
-rw-r--r-- | data/vim/patches/8.1.0307 | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0307 b/data/vim/patches/8.1.0307 new file mode 100644 index 000000000..95342de6e --- /dev/null +++ b/data/vim/patches/8.1.0307 @@ -0,0 +1,233 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0307 +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.0307 +Problem: There is no good way to get the window layout. +Solution: Add the winlayout() function. (Yegappan Lakshmanan) +Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/window.pro, + src/window.c, src/testdir/test_window_id.vim + + +*** ../vim-8.1.0306/runtime/doc/eval.txt 2018-07-29 15:34:20.864300100 +0200 +--- runtime/doc/eval.txt 2018-08-21 16:35:43.299154086 +0200 +*************** +*** 2497,2502 **** +--- 2504,2510 ---- + winbufnr({nr}) Number buffer number of window {nr} + wincol() Number window column of the cursor + winheight({nr}) Number height of window {nr} ++ winlayout([{tabnr}]) List layout of windows in tab {tabnr} + winline() Number window line of the cursor + winnr([{expr}]) Number number of current window + winrestcmd() String returns command to restore window sizes +*************** +*** 9087,9092 **** +--- 9096,9130 ---- + Examples: > + :echo "The current window has " . winheight(0) . " lines." + < ++ winlayout([{tabnr}]) *winlayout()* ++ The result is a nested List containing the layout of windows ++ in a tabpage. ++ ++ Without {tabnr} use the current tabpage, otherwise the tabpage ++ with number {tabnr}. If the tabpage {tabnr} is not found, ++ returns an empty list. ++ ++ For a leaf window, it returns: ++ ['leaf', {winid}] ++ For horizontally split windows, which form a column, it ++ returns: ++ ['col', [{nested list of windows}]] ++ For vertically split windows, which form a row, it returns: ++ ['row', [{nested list of windows}]] ++ ++ Example: > ++ " Only one window in the tab page ++ :echo winlayout() ++ ['leaf', 1000] ++ " Two horizontally split windows ++ :echo winlayout() ++ ['col', [['leaf', 1000], ['leaf', 1001]]] ++ " Three horizontally split windows, with two ++ " vertically split windows in the middle window ++ :echo winlayout(2) ++ ['col', [['leaf', 1002], ['row', ['leaf', 1003], ++ ['leaf', 1001]]], ['leaf', 1000]] ++ < + *winline()* + winline() The result is a Number, which is the screen line of the cursor + in the window. This is counting screen lines from the top of +*** ../vim-8.1.0306/src/evalfunc.c 2018-08-11 13:57:16.211969806 +0200 +--- src/evalfunc.c 2018-08-21 16:19:29.914566586 +0200 +*************** +*** 463,468 **** +--- 463,469 ---- + static void f_winbufnr(typval_T *argvars, typval_T *rettv); + static void f_wincol(typval_T *argvars, typval_T *rettv); + static void f_winheight(typval_T *argvars, typval_T *rettv); ++ static void f_winlayout(typval_T *argvars, typval_T *rettv); + static void f_winline(typval_T *argvars, typval_T *rettv); + static void f_winnr(typval_T *argvars, typval_T *rettv); + static void f_winrestcmd(typval_T *argvars, typval_T *rettv); +*************** +*** 952,957 **** +--- 953,959 ---- + {"winbufnr", 1, 1, f_winbufnr}, + {"wincol", 0, 0, f_wincol}, + {"winheight", 1, 1, f_winheight}, ++ {"winlayout", 0, 1, f_winlayout}, + {"winline", 0, 0, f_winline}, + {"winnr", 0, 1, f_winnr}, + {"winrestcmd", 0, 0, f_winrestcmd}, +*************** +*** 13743,13748 **** +--- 13745,13773 ---- + } + + /* ++ * "winlayout()" function ++ */ ++ static void ++ f_winlayout(typval_T *argvars, typval_T *rettv) ++ { ++ tabpage_T *tp; ++ ++ if (rettv_list_alloc(rettv) != OK) ++ return; ++ ++ if (argvars[0].v_type == VAR_UNKNOWN) ++ tp = curtab; ++ else ++ { ++ tp = find_tabpage((int)get_tv_number(&argvars[0])); ++ if (tp == NULL) ++ return; ++ } ++ ++ get_framelayout(tp->tp_topframe, rettv->vval.v_list, TRUE); ++ } ++ ++ /* + * "winline()" function + */ + static void +*** ../vim-8.1.0306/src/proto/window.pro 2018-06-12 16:49:26.366028607 +0200 +--- src/proto/window.pro 2018-08-21 16:38:15.282101882 +0200 +*************** +*** 94,97 **** +--- 94,98 ---- + win_T *win_id2wp(typval_T *argvars); + int win_id2win(typval_T *argvars); + void win_findbuf(typval_T *argvars, list_T *list); ++ void get_framelayout(frame_T *fr, list_T *l, int topframe); + /* vim: set ft=c : */ +*** ../vim-8.1.0306/src/window.c 2018-07-25 22:36:48.991518559 +0200 +--- src/window.c 2018-08-21 16:43:30.963948179 +0200 +*************** +*** 7236,7239 **** +--- 7236,7288 ---- + list_append_number(list, wp->w_id); + } + ++ /* ++ * Get the layout of the given tab page for winlayout(). ++ */ ++ void ++ get_framelayout(frame_T *fr, list_T *l, int outer) ++ { ++ frame_T *child; ++ list_T *fr_list; ++ list_T *win_list; ++ ++ if (fr == NULL) ++ return; ++ ++ if (outer) ++ // outermost call from f_winlayout() ++ fr_list = l; ++ else ++ { ++ fr_list = list_alloc(); ++ if (fr_list == NULL) ++ return; ++ list_append_list(l, fr_list); ++ } ++ ++ if (fr->fr_layout == FR_LEAF) ++ { ++ if (fr->fr_win != NULL) ++ { ++ list_append_string(fr_list, (char_u *)"leaf", -1); ++ list_append_number(fr_list, fr->fr_win->w_id); ++ } ++ } ++ else ++ { ++ list_append_string(fr_list, ++ fr->fr_layout == FR_ROW ? (char_u *)"row" : (char_u *)"col", -1); ++ ++ win_list = list_alloc(); ++ if (win_list == NULL) ++ return; ++ list_append_list(fr_list, win_list); ++ child = fr->fr_child; ++ while (child != NULL) ++ { ++ get_framelayout(child, win_list, FALSE); ++ child = child->fr_next; ++ } ++ } ++ } + #endif +*** ../vim-8.1.0306/src/testdir/test_window_id.vim 2016-11-13 14:25:47.000000000 +0100 +--- src/testdir/test_window_id.vim 2018-08-21 16:47:00.102536647 +0200 +*************** +*** 101,103 **** +--- 101,123 ---- + call assert_equal(win_getid(1), win_getid(1, 1)) + tabclose! + endfunc ++ ++ func Test_winlayout() ++ let w1 = win_getid() ++ call assert_equal(['leaf', w1], winlayout()) ++ ++ split ++ let w2 = win_getid() ++ call assert_equal(['col', [['leaf', w2], ['leaf', w1]]], winlayout()) ++ ++ split ++ let w3 = win_getid() ++ call assert_equal(['col', [['leaf', w3], ['leaf', w2], ['leaf', w1]]], winlayout()) ++ ++ 2wincmd w ++ vsplit ++ let w4 = win_getid() ++ call assert_equal(['col', [['leaf', w3], ['row', [['leaf', w4], ['leaf', w2]]], ['leaf', w1]]], winlayout()) ++ ++ only! ++ endfunc +*** ../vim-8.1.0306/src/version.c 2018-08-21 15:12:10.843801621 +0200 +--- src/version.c 2018-08-21 16:54:45.515933731 +0200 +*************** +*** 796,797 **** +--- 796,799 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 307, + /**/ + +-- +Friends? I have lots of friends! In fact, I have all episodes ever made. + + /// 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 /// |