aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjing <lhchenjw@gmail.com>2021-05-01 10:21:14 +0800
committerjing <lhchenjw@gmail.com>2021-05-06 23:45:16 +0800
commit73154bbae033513a937af8092320920a49684ce6 (patch)
tree1dcbc6bef8b2f6988586c42ff6ec68a1bb773116
parent3c00252248daf54c5ba4ef2c983256cf81c71ded (diff)
downloadrneovim-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.c7
-rw-r--r--src/nvim/testdir/test_execute_func.vim9
-rw-r--r--src/nvim/window.c9
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;
}
}