Patch 8.0.0475
Problem: Not enough testing for the client-server feature.
Solution: Add more tests. Add the remote_startserver() function. Fix that
a locally evaluated expression uses function-local variables.
Files: src/if_xcmdsrv.c, src/evalfunc.c, src/os_mswin.c,
src/proto/main.pro, src/testdir/test_clientserver.vim,
runtime/doc/eval.txt
*** ../vim-8.0.0474/src/if_xcmdsrv.c 2017-03-16 17:23:26.823815869 +0100
--- src/if_xcmdsrv.c 2017-03-18 18:00:48.479701197 +0100
***************
*** 399,425 ****
/* Execute locally if no display or target is ourselves */
if (dpy == NULL || (serverName != NULL && STRICMP(name, serverName) == 0))
! {
! if (asExpr)
! {
! char_u *ret;
!
! ret = eval_client_expr_to_string(cmd);
! if (result != NULL)
! {
! if (ret == NULL)
! *result = vim_strsave((char_u *)_(e_invexprmsg));
! else
! *result = ret;
! }
! else
! vim_free(ret);
! return ret == NULL ? -1 : 0;
! }
! else
! server_to_input_buf(cmd);
! return 0;
! }
/*
* Bind the server name to a communication window.
--- 399,405 ----
/* Execute locally if no display or target is ourselves */
if (dpy == NULL || (serverName != NULL && STRICMP(name, serverName) == 0))
! return sendToLocalVim(cmd, asExpr, result);
/*
* Bind the server name to a communication window.
***************
*** 800,805 ****
--- 780,786 ----
WaitForReply(void *p)
{
Window *w = (Window *) p;
+
return ServerReplyFind(*w, SROP_Find) != NULL;
}
*** ../vim-8.0.0474/src/evalfunc.c 2017-03-12 20:09:59.460468432 +0100
--- src/evalfunc.c 2017-03-18 17:19:11.629583419 +0100
***************
*** 307,312 ****
--- 307,313 ----
static void f_remote_peek(typval_T *argvars, typval_T *rettv);
static void f_remote_read(typval_T *argvars, typval_T *rettv);
static void f_remote_send(typval_T *argvars, typval_T *rettv);
+ static void f_remote_startserver(typval_T *argvars, typval_T *rettv);
static void f_remove(typval_T *argvars, typval_T *rettv);
static void f_rename(typval_T *argvars, typval_T *rettv);
static void f_repeat(typval_T *argvars, typval_T *rettv);
***************
*** 741,746 ****
--- 742,748 ----
{"remote_peek", 1, 2, f_remote_peek},
{"remote_read", 1, 1, f_remote_read},
{"remote_send", 2, 3, f_remote_send},
+ {"remote_startserver", 1, 1, f_remote_startserver},
{"remove", 2, 3, f_remove},
{"rename", 2, 2, f_rename},
{"repeat", 2, 2, f_repeat},
***************
*** 8487,8493 ****
make_connection();
if (X_DISPLAY == NULL)
{
! EMSG(_("E240: No connection to Vim server"));
return FAIL;
}
return OK;
--- 8489,8495 ----
make_connection();
if (X_DISPLAY == NULL)
{
! EMSG(_("E240: No connection to the X server"));
return FAIL;
}
return OK;
***************
*** 8689,8694 ****
--- 8691,8723 ----
#endif
}
+ /*
+ * "remote_startserver()" function
+ */
+ static void
+ f_remote_startserver(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+ {
+ #ifdef FEAT_CLIENTSERVER
+ char_u *server = get_tv_string_chk(&argvars[0]);
+
+ if (server == NULL)
+ return; /* type error; errmsg already given */
+ if (serverName != NULL)
+ EMSG(_("E941: already started a server"));
+ else
+ {
+ # ifdef FEAT_X11
+ if (check_connection() == OK)
+ serverRegisterName(X_DISPLAY, server);
+ # else
+ serverSetName(server);
+ # endif
+ }
+ #else
+ EMSG(_("E942: +clientserver feature not available"));
+ #endif
+ }
+
/*
* "remove()" function
*/
*** ../vim-8.0.0474/src/os_mswin.c 2017-03-18 16:18:25.103693785 +0100
--- src/os_mswin.c 2017-03-18 18:01:05.019583007 +0100
***************
*** 2409,2414 ****
--- 2409,2418 ----
int retcode = 0;
char_u altname_buf[MAX_PATH];
+ /* Execute locally if no display or target is ourselves */
+ if (serverName != NULL && STRICMP(name, serverName) == 0)
+ return sendToLocalVim(cmd, asExpr, result);
+
/* If the server name does not end in a digit then we look for an
* alternate name. e.g. when "name" is GVIM the we may find GVIM2. */
if (STRLEN(name) > 1 && !vim_isdigit(name[STRLEN(name) - 1]))
*** ../vim-8.0.0474/src/proto/main.pro 2016-09-12 13:04:10.000000000 +0200
--- src/proto/main.pro 2017-03-18 17:59:50.252117273 +0100
***************
*** 11,15 ****
--- 11,16 ----
void time_msg(char *mesg, void *tv_start);
void server_to_input_buf(char_u *str);
char_u *eval_client_expr_to_string(char_u *expr);
+ int sendToLocalVim(char_u *cmd, int asExpr, char_u **result);
char_u *serverConvert(char_u *client_enc, char_u *data, char_u **tofree);
/* vim: set ft=c : */
*** ../vim-8.0.0474/src/testdir/test_clientserver.vim 2017-03-18
16:18:25.099693814 +0100
--- src/testdir/test_clientserver.vim 2017-03-18 17:45:24.702325840 +0100
***************
*** 30,35 ****
--- 30,60 ----
call WaitFor('remote_expr("' . name . '", "testvar") == "yes"')
call assert_equal('yes', remote_expr(name, "testvar"))
+ if has('unix') && has('gui') && !has('gui_running')
+ " Running in a terminal and the GUI is avaiable: Tell the server to open
+ " the GUI and check that the remote command still works.
+ " Need to wait for the GUI to start up, otherwise the send hangs in trying
+ " to send to the terminal window.
+ call remote_send(name, ":gui -f\<CR>")
+ sleep 500m
+ call remote_send(name, ":let testvar = 'maybe'\<CR>")
+ call WaitFor('remote_expr("' . name . '", "testvar") == "maybe"')
+ call assert_equal('maybe', remote_expr(name, "testvar"))
+ endif
+
+ call assert_fails('call remote_send("XXX", ":let testvar = ''yes''\<CR>")',
'E241')
+
+ " Expression evaluated locally.
+ if v:servername == ''
+ call remote_startserver('MYSELF')
+ call assert_equal('MYSELF', v:servername)
+ endif
+ let g:testvar = 'myself'
+ call assert_equal('myself', remote_expr(v:servername, 'testvar'))
+
+ call remote_send(name, ":call server2client(expand('<client>'), 'got
it')\<CR>", 'g:myserverid')
+ call assert_equal('got it', remote_read(g:myserverid))
+
call remote_send(name, ":qa!\<CR>")
call WaitFor('job_status(g:job) == "dead"')
if job_status(g:job) != 'dead'
*** ../vim-8.0.0474/runtime/doc/eval.txt 2017-03-09 18:19:58.153107904
+0100
--- runtime/doc/eval.txt 2017-03-18 18:05:48.361558128 +0100
***************
*** 2259,2264 ****
--- 2262,2269 ----
remote_read({serverid}) String read reply string
remote_send({server}, {string} [, {idvar}])
String send key sequence
+ remote_startserver({name}) none become server {name}
+ String send key sequence
remove({list}, {idx} [, {end}]) any remove items {idx}-{end} from
{list}
remove({dict}, {key}) any remove entry {key} from {dict}
rename({from}, {to}) Number rename (move) file from {from} to {to}
***************
*** 6357,6362 ****
--- 6377,6383 ----
See also |clientserver| |RemoteReply|.
This function is not available in the |sandbox|.
{only available when compiled with the |+clientserver| feature}
+
Note: Any errors will be reported in the server and may mess
up the display.
Examples: >
***************
*** 6368,6373 ****
--- 6389,6400 ----
:echo remote_send("gvim", ":sleep 10 | echo ".
\ 'server2client(expand("<client>"), "HELLO")<CR>')
<
+ *remote_startserver()* *E941* *E942*
+ remote_startserver({name})
+ Become the server {name}. This fails if already running as a
+ server, when |v:servername| is not empty.
+ {only available when compiled with the |+clientserver| feature}
+
remove({list}, {idx} [, {end}]) *remove()*
Without {end}: Remove the item at {idx} from |List| {list} and
return the item.
*** ../vim-8.0.0474/src/version.c 2017-03-18 16:18:25.103693785 +0100
--- src/version.c 2017-03-18 17:01:15.061284034 +0100
***************
*** 766,767 ****
--- 766,769 ----
{ /* Add new patch number below this line */
+ /**/
+ 475,
/**/
--
hundred-and-one symptoms of being an internet addict:
146. You experience ACTUAL physical withdrawal symptoms when away
from your 'puter and the net.
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.