]> granicus.if.org Git - vim/commitdiff
patch 8.0.0475: not enough testing for the client-server feature v8.0.0475
authorBram Moolenaar <Bram@vim.org>
Sat, 18 Mar 2017 17:10:13 +0000 (18:10 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 18 Mar 2017 17:10:13 +0000 (18:10 +0100)
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.

runtime/doc/eval.txt
src/evalfunc.c
src/if_xcmdsrv.c
src/os_mswin.c
src/proto/main.pro
src/testdir/test_clientserver.vim
src/version.c

index efa5b9dd053964d356fe1bb62d7424cccdae317a..c271549037dde156a035af21847136f10b33df05 100644 (file)
@@ -2262,6 +2262,8 @@ remote_peek({serverid} [, {retvar}])
 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}
@@ -6372,6 +6374,7 @@ remote_send({server}, {string} [, {idvar}])
                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: >
@@ -6383,6 +6386,12 @@ remote_send({server}, {string} [, {idvar}])
                :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.
index 21b75c1082284c21863eed26a1f6ad767694c232..bee58eee1173382632541a1ea9194d804c569dc1 100644 (file)
@@ -307,6 +307,7 @@ static void f_remote_foreground(typval_T *argvars, typval_T *rettv);
 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,6 +742,7 @@ static struct fst
     {"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,7 +8489,7 @@ check_connection(void)
     make_connection();
     if (X_DISPLAY == NULL)
     {
-       EMSG(_("E240: No connection to Vim server"));
+       EMSG(_("E240: No connection to the X server"));
        return FAIL;
     }
     return OK;
@@ -8689,6 +8691,33 @@ f_remote_send(typval_T *argvars UNUSED, typval_T *rettv)
 #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
  */
index fa91c3e8c1f13f77d7bd749d3ad1f8e0f5cd3d90..18c208b967cc844fa1259080087968041e06dffa 100644 (file)
@@ -399,27 +399,7 @@ serverSendToVim(
 
     /* 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;
-    }
+       return sendToLocalVim(cmd, asExpr, result);
 
     /*
      * Bind the server name to a communication window.
@@ -800,6 +780,7 @@ serverSendReply(char_u *name, char_u *str)
 WaitForReply(void *p)
 {
     Window  *w = (Window *) p;
+
     return ServerReplyFind(*w, SROP_Find) != NULL;
 }
 
index 16630529882df8b41f1d6f28ac293c5e4abedb6a..cfa208493c676042a14c30f04e651e9803d3b7b4 100644 (file)
@@ -2409,6 +2409,10 @@ serverSendToVim(
     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]))
index 958e1f3bbff5cac294ebadc3d536c526d37fa8e0..f8abb94b59219d593aaa45047f910b3242f4e328 100644 (file)
@@ -11,5 +11,6 @@ void time_pop(void *tp);
 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 : */
index 55cc98ec8d5aebda0489cbce4af8a4a5ade47239..55f440ffc20f9361b3e81033f73fc3367aef1e63 100644 (file)
@@ -30,6 +30,31 @@ func Test_client_server()
   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'
index 72c8e78ddeb8fe03cade446c03fac4c5930778f8..18ba30e87adeae9084f3bd3bc2e03046797465f9 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    475,
 /**/
     474,
 /**/