@@ -739,10 +739,10 @@ static struct fst
739739 {"reltimefloat" , 1 , 1 , f_reltimefloat },
740740#endif
741741 {"reltimestr" , 1 , 1 , f_reltimestr },
742- {"remote_expr" , 2 , 3 , f_remote_expr },
742+ {"remote_expr" , 2 , 4 , f_remote_expr },
743743 {"remote_foreground" , 1 , 1 , f_remote_foreground },
744744 {"remote_peek" , 1 , 2 , f_remote_peek },
745- {"remote_read" , 1 , 1 , f_remote_read },
745+ {"remote_read" , 1 , 2 , f_remote_read },
746746 {"remote_send" , 2 , 3 , f_remote_send },
747747 {"remote_startserver" , 1 , 1 , f_remote_startserver },
748748 {"remove" , 2 , 3 , f_remove },
@@ -8515,6 +8515,7 @@ remote_common(typval_T *argvars, typval_T *rettv, int expr)
85158515 char_u * keys ;
85168516 char_u * r = NULL ;
85178517 char_u buf [NUMBUFLEN ];
8518+ int timeout = 0 ;
85188519# ifdef WIN32
85198520 HWND w ;
85208521# else
@@ -8528,16 +8529,19 @@ remote_common(typval_T *argvars, typval_T *rettv, int expr)
85288529 if (check_connection () == FAIL )
85298530 return ;
85308531# endif
8532+ if (argvars [2 ].v_type != VAR_UNKNOWN
8533+ && argvars [3 ].v_type != VAR_UNKNOWN )
8534+ timeout = get_tv_number (& argvars [3 ]);
85318535
85328536 server_name = get_tv_string_chk (& argvars [0 ]);
85338537 if (server_name == NULL )
85348538 return ; /* type error; errmsg already given */
85358539 keys = get_tv_string_buf (& argvars [1 ], buf );
85368540# ifdef WIN32
8537- if (serverSendToVim (server_name , keys , & r , & w , expr , TRUE) < 0 )
8541+ if (serverSendToVim (server_name , keys , & r , & w , expr , timeout , TRUE) < 0 )
85388542# else
8539- if (serverSendToVim (X_DISPLAY , server_name , keys , & r , & w , expr , 0 , TRUE)
8540- < 0 )
8543+ if (serverSendToVim (X_DISPLAY , server_name , keys , & r , & w , expr , timeout ,
8544+ 0 , TRUE) < 0 )
85418545# endif
85428546 {
85438547 if (r != NULL )
@@ -8555,13 +8559,15 @@ remote_common(typval_T *argvars, typval_T *rettv, int expr)
85558559 char_u str [30 ];
85568560 char_u * idvar ;
85578561
8558- sprintf ((char * )str , PRINTF_HEX_LONG_U , (long_u )w );
8559- v .di_tv .v_type = VAR_STRING ;
8560- v .di_tv .vval .v_string = vim_strsave (str );
85618562 idvar = get_tv_string_chk (& argvars [2 ]);
8562- if (idvar != NULL )
8563+ if (idvar != NULL && * idvar != NUL )
8564+ {
8565+ sprintf ((char * )str , PRINTF_HEX_LONG_U , (long_u )w );
8566+ v .di_tv .v_type = VAR_STRING ;
8567+ v .di_tv .vval .v_string = vim_strsave (str );
85638568 set_var (idvar , & v .di_tv , FALSE);
8564- vim_free (v .di_tv .vval .v_string );
8569+ vim_free (v .di_tv .vval .v_string );
8570+ }
85658571 }
85668572}
85678573#endif
@@ -8633,7 +8639,7 @@ f_remote_peek(typval_T *argvars UNUSED, typval_T *rettv)
86338639 rettv -> vval .v_number = -1 ;
86348640 else
86358641 {
8636- s = serverGetReply ((HWND )n , FALSE, FALSE, FALSE);
8642+ s = serverGetReply ((HWND )n , FALSE, FALSE, FALSE, 0 );
86378643 rettv -> vval .v_number = (s != NULL );
86388644 }
86398645# else
@@ -8670,17 +8676,23 @@ f_remote_read(typval_T *argvars UNUSED, typval_T *rettv)
86708676
86718677 if (serverid != NULL && !check_restricted () && !check_secure ())
86728678 {
8679+ int timeout = 0 ;
8680+
8681+ if (argvars [1 ].v_type != VAR_UNKNOWN )
8682+ timeout = get_tv_number (& argvars [1 ]);
8683+
86738684# ifdef WIN32
86748685 /* The server's HWND is encoded in the 'id' parameter */
86758686 long_u n = 0 ;
86768687
86778688 sscanf ((char * )serverid , SCANF_HEX_LONG_U , & n );
86788689 if (n != 0 )
8679- r = serverGetReply ((HWND )n , FALSE, TRUE, TRUE);
8690+ r = serverGetReply ((HWND )n , FALSE, TRUE, TRUE, timeout );
86808691 if (r == NULL )
86818692# else
8682- if (check_connection () == FAIL || serverReadReply (X_DISPLAY ,
8683- serverStrToWin (serverid ), & r , FALSE) < 0 )
8693+ if (check_connection () == FAIL
8694+ || serverReadReply (X_DISPLAY , serverStrToWin (serverid ),
8695+ & r , FALSE, timeout ) < 0 )
86848696# endif
86858697 EMSG (_ ("E277: Unable to read a server reply" ));
86868698 }
0 commit comments