@@ -492,6 +492,7 @@ static void f_values(typval_T *argvars, typval_T *rettv);
492492static void f_virtcol (typval_T * argvars , typval_T * rettv );
493493static void f_visualmode (typval_T * argvars , typval_T * rettv );
494494static void f_wildmenumode (typval_T * argvars , typval_T * rettv );
495+ static void f_win_execute (typval_T * argvars , typval_T * rettv );
495496static void f_win_findbuf (typval_T * argvars , typval_T * rettv );
496497static void f_win_getid (typval_T * argvars , typval_T * rettv );
497498static void f_win_gotoid (typval_T * argvars , typval_T * rettv );
@@ -1045,6 +1046,7 @@ static struct fst
10451046 {"virtcol" , 1 , 1 , f_virtcol },
10461047 {"visualmode" , 0 , 1 , f_visualmode },
10471048 {"wildmenumode" , 0 , 0 , f_wildmenumode },
1049+ {"win_execute" , 2 , 3 , f_win_execute },
10481050 {"win_findbuf" , 1 , 1 , f_win_findbuf },
10491051 {"win_getid" , 0 , 2 , f_win_getid },
10501052 {"win_gotoid" , 1 , 1 , f_win_gotoid },
@@ -3519,7 +3521,7 @@ get_list_line(
35193521 * "execute()" function
35203522 */
35213523 static void
3522- f_execute (typval_T * argvars , typval_T * rettv )
3524+ execute_common (typval_T * argvars , typval_T * rettv , int arg_off )
35233525{
35243526 char_u * cmd = NULL ;
35253527 list_T * list = NULL ;
@@ -3535,25 +3537,25 @@ f_execute(typval_T *argvars, typval_T *rettv)
35353537 rettv -> vval .v_string = NULL ;
35363538 rettv -> v_type = VAR_STRING ;
35373539
3538- if (argvars [0 ].v_type == VAR_LIST )
3540+ if (argvars [arg_off ].v_type == VAR_LIST )
35393541 {
3540- list = argvars [0 ].vval .v_list ;
3542+ list = argvars [arg_off ].vval .v_list ;
35413543 if (list == NULL || list -> lv_first == NULL )
35423544 /* empty list, no commands, empty output */
35433545 return ;
35443546 ++ list -> lv_refcount ;
35453547 }
35463548 else
35473549 {
3548- cmd = tv_get_string_chk (& argvars [0 ]);
3550+ cmd = tv_get_string_chk (& argvars [arg_off ]);
35493551 if (cmd == NULL )
35503552 return ;
35513553 }
35523554
3553- if (argvars [1 ].v_type != VAR_UNKNOWN )
3555+ if (argvars [arg_off + 1 ].v_type != VAR_UNKNOWN )
35543556 {
35553557 char_u buf [NUMBUFLEN ];
3556- char_u * s = tv_get_string_buf_chk (& argvars [1 ], buf );
3558+ char_u * s = tv_get_string_buf_chk (& argvars [arg_off + 1 ], buf );
35573559
35583560 if (s == NULL )
35593561 return ;
@@ -3620,6 +3622,15 @@ f_execute(typval_T *argvars, typval_T *rettv)
36203622 msg_col = save_msg_col ;
36213623}
36223624
3625+ /*
3626+ * "execute()" function
3627+ */
3628+ static void
3629+ f_execute (typval_T * argvars , typval_T * rettv )
3630+ {
3631+ execute_common (argvars , rettv , 0 );
3632+ }
3633+
36233634/*
36243635 * "exepath()" function
36253636 */
@@ -6096,6 +6107,30 @@ f_getwininfo(typval_T *argvars, typval_T *rettv)
60966107 }
60976108}
60986109
6110+ /*
6111+ * "win_execute()" function
6112+ */
6113+ static void
6114+ f_win_execute (typval_T * argvars , typval_T * rettv )
6115+ {
6116+ int id = (int )tv_get_number (argvars );
6117+ win_T * wp = win_id2wp (id );
6118+ win_T * save_curwin = curwin ;
6119+
6120+ if (wp != NULL )
6121+ {
6122+ curwin = wp ;
6123+ curbuf = curwin -> w_buffer ;
6124+ check_cursor ();
6125+ execute_common (argvars , rettv , 1 );
6126+ if (win_valid (save_curwin ))
6127+ {
6128+ curwin = save_curwin ;
6129+ curbuf = curwin -> w_buffer ;
6130+ }
6131+ }
6132+ }
6133+
60996134/*
61006135 * "win_findbuf()" function
61016136 */
0 commit comments