如果编译时加入  +clientserver  特性,Vim 可以作为命令服务器,接受客户的消息并
执行。同时,Vim 也可以作为客户端,发送消息给 Vim 服务器。
可以使用以下的命令行参数:
     参数                       意义    
   --remote [+{cmd}] {file} ...                                  --remote 
                                在远端打开文件列表。如果没有 Vim 服务器,就在
                                本地执行。
                                有一个可选的初始命令: #{cmd},它必须是后面可以
                                跟 "|" 的 Ex 命令。
                                命令行的其余部分将作为文件列表。所以,非文件
                                的参数一定要在此之前出现。
                                你不能用这个方法编辑标准输入  -- 。
                                远端的 Vim 将被推向前台。如果不想如此,用
                                 vim --remote-send "<C-\><C-N>:n filename<CR>"
   --remote-silent [+{cmd}] {file} ...                   --remote-silent 
                                同上,但如果服务器没打开而需要本地编辑,不产生
                                警告。
   --remote-wait [+{cmd}] {file} ...                             --remote-wait 
                                同 --remote,但直到所有的文件在远端被完成 (卸
                                载) 为止才返回。
   --remote-wait-silent [+{cmd}] {file} ...              --remote-wait-silent 
                                同 --remote-wait,但如果服务器没打开,不产生警
                                告。
                                                         --remote-tab 
   --remote-tab                 同 --remote 但用新标签页打开每个文件。
                                                         --remote-tab-silent 
   --remote-tab-silent          同 --remote-silent 但用新标签页打开每个文件。
                                                         --remote-tab-wait 
   --remote-tab-wait            同 --remote-wait 但用新标签页打开每个文件。
                                                 --remote-tab-wait-silent 
   --remote-tab-wait-silent     同 --remote-wait-silent 但用新标签页打开每个文
                                件。
                                                                 --servername 
   --servername {name}          成为用 {name} 作为名字的服务器。如果同时也用了
                                某个 --remote 命令,连接到服务器 {name},而不
                                使用缺省的名字。(见下)。用大写形式的名字。要使
                                用套接字服务器,可指定路径,详见
                                 socketserver-name 。
                                                                 --remote-send 
   --remote-send {keys}         发送键序列 {keys} 到服务器,然后退出。{keys}
                                不通过映射。能识别特殊的键名,如 "<CR>" 会生成
                                CR 字符。
                                                                 --remote-expr 
   --remote-expr {expr}         在服务器上执行 {expr}。然后在标准输出上打出结
                                果。
                                                                 --serverlist 
   --serverlist                 输出可用的服务器名字的列表。
                                                                 --clientserver 
   --clientserver {method}      客户端-服务器功能的后端使用指定方法 {method}。
                                可选值为 "socket" 或 "x11"。
                                {仅当编译时加入  +X11  和  +socketserver  特性
                                才有效}
示例 
在一个已经运行的 GVIM 服务器上编辑 "file.txt"。
    gvim --remote file.txt
在一个已经运行的名为 FOOBAR 的服务器上编辑 "file.txt"。
    gvim --servername FOOBAR --remote file.txt
在名为 "FILES" 的服务器上编辑 "file.txt",如果不存在这个服务器,自己成为服务器
"FILES"。
    gvim --servername FILES --remote-silent file.txt
下面的例子不能工作。--remote 之后所有的参数都被视作文件名:
    gvim --remote --servername FOOBAR file.txt
在远端服务器上编辑文件 "+foo" (注意 "./" 的使用避免了打头的加号的特别含义)。
    vim --remote ./+foo
告诉远端服务器 "BLA" 写入所有文件,并且退出。
    vim --servername BLA --remote-send '<C-\><C-N>:wqa<CR>'
服 务 器 名                                              client-server-name 
缺省地,Vim 试图用启动时的名字注册服务器名 (gvim、egvim ...),你可以用
--servername 参数覆盖之。如果不能用指定的名字,尝试附加一个后缀,直到找到一个
空闲的名字为止。比如,在同一个 X 服务器上,第二次启动 gvim 的服务器名会是
"gvim1"。可以通过  v:servername  得到最终的服务器名。这里忽略大小写的区别,所
以 "gvim" 和 "GVIM" 重复。注意 使用套接字服务器时有若干差异,见
 socketserver-differences 。
当 Vim 启动时带有 --remote、--remote-wait 或者 --remote-send 参数时,会根据上
述的方法由启动名和指定的 --servername 参数决定要访问的服务器名。如果准确的匹
配找不到,寻找第一个可以带数字后缀的服务器。不过,如果 --servername 给出的名字
已经带有数字后缀,必须准确匹配。
如果使用 --remote 和 --remote-wait 但没有可用的服务器,Vim 会根据剩余的参数启
动,自己编辑这些文件。这样,发送命令给 gvim 的时候,就不需要关心它是否已经启
动。
--serverlist 参数让 Vim 在标准输出 (stdout) 上打出所有已经注册的命令服务器,然
后退出。注意 使用套接字服务器时有若干限制,见  socketserver-differences 。
                                                         {server} 
若干函数使用 {server} 参数。如为空串,Unix 上会使用缺省服务器名,即 "GVIM"。
MS-Windows 上空串不能工作。
Win32 注意事项: 不一定总能把 Vim 服务器切换到在前台,因为 MS-Windows 不允许这
么做。客户通过 --remote 和 --remote-wait 参数调用而服务器名以 "g" 开始的时候,
服务器将被推向前台。
远 程 编 辑
用上面的结果,--remote 参数随后基于其后的参数构造一个  :drop  命令并发送之。
--remote-wait 也会这么做,但同时等待所有文件编辑任务的完成。这是通过 BufUnload
事件完成的。文件卸载时,Vim 假设你完成了它的编辑任务。
注意: --remote 和 --remote-list 参数会吃掉命令行余下的部分。也就是说,余下的参
数都被认为是文件名,不要把参数放在那里!
函 数
                                                                 E240   E573 
若干 Vim 的函数可以用来书写命令服务器的脚本。参见  builtin.txt  的描述,也可以
在下面的函数名字上按 CTRL-] 以得到它们完整的描述。
    摘要                                     解释 
    remote_startserver( name)                运行服务器
    remote_expr( server, string, idvar)      发送表达式
    remote_send( server, string, idvar)      发送键序列
    serverlist()                             得到可用服务器的列表
    remote_peek( serverid, retvar)           检查返回的字符串
    remote_read( serverid)                   读取返回的字符串
    server2client( serverid, string)         发送返回字符串
    remote_foreground( server)               把服务器推向前台
也可参考  CTRL-\_CTRL-N ,它可用来引导键序列。
server2client() 的 {serverid} 可以通过 expand("<client>") 得到。
                                     E247   E248   E251   E258   E277 
客户和服务器的通信是通过 X 服务器进行的。必须指明 Vim 服务器所处的 DISPLAY 位
置。通常的 X 服务器的保护措施这里也适用,你必须有权限在 X 服务器上打开一个窗
口,这样不同系统间的通信才有可能。
缺省地,GUI 的 Vim 会在 X 服务器上注册一个名字,使得后续的执行能通过这个名字寻
址并向它发送字符串。Vim 也可以作为一个客户端,给同一个 X11 显示上的其它 Vim 实
例发送字符串。
X11 GUI 的 Vim (gvim) 启动时,会试图在根窗口的 'VimRegistry' 属性上注册发送服
务器的名字。
非 GUI 但可以访问到 X11 显示的 Vim (打开了  xterm-clipboard ) 也可以作为命令服
务器,只要服务器名通过 --servername 参数明确给出,或者 Vim 编译时带
 +autoservername  特性就行了。
空的 --servername 参数关闭命令服务器。
要从别的应用程序向 Vim 服务器发送命令,可以阅读源代码 src/if_xcmdsrv.c。那里包
含了 Vim 使用的协议的一些情况。
每个 Win32 的 Vim 都可以作为服务器,包括控制台版本。你不需要编译时带 OLE 的版
本。我们使用 Windows 消息,它适用于任何版本的 MS-Windows。不过,它只允许在同一
个机器上进行通信。
因为我们使用 MS-Windows 的消息,别的应用程序也可以和 Vim 服务器通信。一个替代
方案是用 OLE 功能  ole-interface 。
如果用 gvim,--remote-wait 正确的使用方法只能是:
        start /w gvim --remote-wait file.txt
                                     E1563   E1564   E1565   E1566   E1567 
客户端和服务器间的通讯使用 Unix 域套接字。放置这些套接字的目录,按照目录的可用
性顺序,如下所示:
    1. "$XDG_RUTIME_DIR/vim",如果设置了环境变量 $XDG_RUNTIME_DIR。
    2. "$TMPDIR/vim-[uid]",其中 "[uid]" 为用户的 uid。此目录会设置访问权限为
       700,只有用户本人可以从中读写。如未设置 $TMPDIR,使用 "/tmp"。
                                                     socketserver-name 
服务器的 id/名字可是通用名,也可是绝对或相对路径。以 "/" (绝对路径) 或
"./" | "../" (相对路径) 开始的服务器 id 被解读为指向套接字的路径。否则,服务
器 id 被当作套接字文件名,它会放置在上述的通用目录下。注意 服务器 id/名字只有
被视作路径时才能包含斜杠 "/",因而 "abc/dir" 作为名字是非法的。
套接字服务器功能在 Vim 的 GTK GUI 和终端版本里可用。除非 Vim 编译时加入了
 +autoservername  特性,套接字服务器必须要显式启动,就像 X11 那样,即使 GUI 版
本也是如此。
如果 Vim 崩溃或非正常退出,套接字文件不会被套接字服务器删除而遗留下来。通常这
不是问题,因为 Vim 接受套接字名时会检查那里的套接字是否失效 (不附着于任何进
程),如果是的话会替代之,而不是寻找新名字。
要从另一个应用发送命令到 Vim 套接字服务器,请阅读源码 src/os_unix.c,那里有所
用协议的完整描述。
                                                     socketserver-differences 
绝大多数功能和 X11 相同,但和 X11 里客户端不需要自己是服务器才能和其他服务器通
信不同,套接字服务器需要客户端本身也作为服务器运行。 serverlist()  和
 --serverlist  参数是例外,那里不需要服务器处于运行状态。
另外,和 X11 或 MS-Windows 不同,服务器 id 或客户端 id 不是 (以十六进制显示的)
数值,而是套接字的绝对路径。它可通过  v:servername  变量查看。
 --serverlist  参数类似于 X11,但只检查上述的通用目录位置。如果套接字使用定制
路径,也就是不在 $XDG_RUNTIME_DIR 或 <$TMPDIR 或 /tmp>/vim 对应带
 --serverlist  Vim 进程的子目录里,就不会被检测到。
如果编译时同时加入了  +socketserver  和  +X11 ,则除了  --serverlist  给出可用
服务器列表外,也需要加入  --clientserver  参数且设为 "socket"。一个命令可以同
时列出这两种类型的后端。
                                                     socketserver-x11 
如果 Vim 编译时同时加入了  +socketserver  和  +X11 ,使用哪种后端的决定发生在
启动时间,借助  --clientserver  参数完成。如果该参数未指定,缺省使用 X11。使用
套接字服务器的 Vim 实例和使用 X11 的实例间无法通信。
MacVim 使用分布对象来进行进程间通信。服务器从命名端口接听新连接,而客户端连接
到此端口来发送信息。服务器列表是由前台 (MacVim) 通过维护所有当前运行的服务器的
列表提供的,这样,服务器不直接意识到对方的存在;只有 MacVim 知道有什么服务器正
在运行。
客户端是任何实现了 MMVimClientProtocol 的对象 (见 MacVim.h)。如果你想为自己的
应用实现此协议,可参考 MMBackend。目前的实现假定 NSConnections 使用 mach 端口
进行进程间通信。这意味你只能用 Vim 的在本地机器上的客户端/服务器特性 (而不能跨
网络)。
备注: 客户端模式总是可用,但服务器模式只能在 GUI 启动后才可用。
 vim:tw=78:sw=4:ts=8:noet:ft=help:norl: