diff options
author | jing <lhchenjw@gmail.com> | 2021-05-01 10:21:14 +0800 |
---|---|---|
committer | jing <lhchenjw@gmail.com> | 2021-05-06 23:45:16 +0800 |
commit | 73154bbae033513a937af8092320920a49684ce6 (patch) | |
tree | 1dcbc6bef8b2f6988586c42ff6ec68a1bb773116 | |
parent | 3c00252248daf54c5ba4ef2c983256cf81c71ded (diff) | |
download | rneovim-73154bbae033513a937af8092320920a49684ce6.tar.gz rneovim-73154bbae033513a937af8092320920a49684ce6.tar.bz2 rneovim-73154bbae033513a937af8092320920a49684ce6.zip |
vim-patch:8.1.1832: win_execute() does not work in other tab
Problem: Win_execute() does not work in other tab. (Rick Howe)
Solution: Take care of the tab. (closes vim/vim#4792)
https://github.com/vim/vim/commit/820680b9ff1de8699156c7b060f97e5c0b87ad15
-rw-r--r-- | src/nvim/eval/funcs.c | 7 | ||||
-rw-r--r-- | src/nvim/testdir/test_execute_func.vim | 9 | ||||
-rw-r--r-- | src/nvim/window.c | 9 |
3 files changed, 22 insertions, 3 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 3a202759b6..0b50f41de3 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -2041,12 +2041,13 @@ static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) // "win_execute(win_id, command)" function static void f_win_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - win_T *wp = win_id2wp(argvars); + tabpage_T *tp; + win_T *wp = win_id2wp_tp(argvars, &tp); win_T *save_curwin; tabpage_T *save_curtab; - if (wp != NULL) { - if (switch_win_noblock(&save_curwin, &save_curtab, wp, curtab, true) == + if (wp != NULL && tp != NULL) { + if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, true) == OK) { check_cursor(); execute_common(argvars, rettv, fptr, 1); diff --git a/src/nvim/testdir/test_execute_func.vim b/src/nvim/testdir/test_execute_func.vim index a634f9fc91..9efed76eda 100644 --- a/src/nvim/testdir/test_execute_func.vim +++ b/src/nvim/testdir/test_execute_func.vim @@ -104,3 +104,12 @@ func Test_win_execute() call win_gotoid(otherwin) bwipe! endfunc + +func Test_win_execute_other_tab() + let thiswin = win_getid() + tabnew + call win_execute(thiswin, 'let xyz = 1') + call assert_equal(1, xyz) + tabclose + unlet xyz +endfunc diff --git a/src/nvim/window.c b/src/nvim/window.c index ddfb4e6ef3..bcd955d1b0 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -6821,10 +6821,19 @@ void win_id2tabwin(typval_T *const argvars, typval_T *const rettv) win_T * win_id2wp(typval_T *argvars) { + return win_id2wp_tp(argvars, NULL); +} + +// Return the window and tab pointer of window "id". +win_T * win_id2wp_tp(typval_T *argvars, tabpage_T **tpp) +{ int id = tv_get_number(&argvars[0]); FOR_ALL_TAB_WINDOWS(tp, wp) { if (wp->handle == id) { + if (tpp != NULL) { + *tpp = tp; + } return wp; } } |