diff options
| -rw-r--r-- | runtime/doc/msgpack_rpc.txt | 89 | 
1 files changed, 46 insertions, 43 deletions
| diff --git a/runtime/doc/msgpack_rpc.txt b/runtime/doc/msgpack_rpc.txt index 8567f4a00e..800ab08ce3 100644 --- a/runtime/doc/msgpack_rpc.txt +++ b/runtime/doc/msgpack_rpc.txt @@ -38,27 +38,28 @@ Nvim's msgpack-rpc interface can be seen as a more powerful version of Vim's  ==============================================================================  2. API							      *msgpack-rpc-api* -Nvim C API is automatically exposed to the msgpack-rpc interface by the +The Nvim C API is automatically exposed to the msgpack-rpc interface by the  build system, which parses headers at src/nvim/api from the project root. A -dispatch function is generated, and it will match msgpack-rpc method names +dispatch function is generated, which matches msgpack-rpc method names  with non-static API functions, converting/validating arguments and return  values back to msgpack.  Client libraries will normally provide wrappers that hide msgpack-rpc details -from programmers, which can be automatically generated by reading bundled api +from programmers, which can be automatically generated by reading bundled API  metadata from a compiled nvim instance.  There are two ways to obtain API metadata: -- By connecting to a running nvim instance and calling `vim_get_api_metadata` -  via msgpack-rpc. This is the preferred way for clients written in -  dynamically-typed languages, which can define functions at runtime. -- Through the `--api-info` command-line option, which makes nvim to dump a -  msgpack blob containing the metadata to stdout and exit. This is preferred -  when writing clients for statically-typed languages, which require a -  separate compilation step. +1. By connecting to a running nvim instance and calling `vim_get_api_metadata` +   via msgpack-rpc. This is the preferred way for clients written in +   dynamically-typed languages, which can define functions at runtime. -Here's a simple way to get human-readable description of the API(requires +2. Through the `--api-info` command-line option, which makes nvim dump a +   msgpack blob containing metadata to stdout and exit. This is preferred +   when writing clients for statically-typed languages, which require a +   separate compilation step. + +Here's a simple way to get human-readable description of the API (requires  python and the pyyaml/msgpack-python pip packages):  >      nvim --api-info | python -c 'import msgpack, sys, yaml; print yaml.dump(msgpack.unpackb(sys.stdin.read()))' > api.yaml @@ -66,7 +67,6 @@ python and the pyyaml/msgpack-python pip packages):  ==============================================================================  3. Connecting					       *msgpack-rpc-connecting* -  There are four ways to open msgpack-rpc streams to nvim:  1. Through nvim's stdin/stdout when started with the `--embed` option. This is @@ -74,31 +74,31 @@ There are four ways to open msgpack-rpc streams to nvim:  2. Through stdin/stdout of a program spawned by the |rpcstart()| function. -3. Through the socket automatically created with every instance. To find out -   the socket location(which is random by default) from a running nvim +3. Through the socket automatically created with each instance. To find out +   the socket location (which is random by default) from a running nvim     instance, one can inspect the *$NVIM_LISTEN_ADDRESS* environment variable     like this:  >      :echo $NVIM_LISTEN_ADDRESS  < -4. Through a tcp/ip socket. To make nvim listen on a tcp/ip socket, you need -   to set the NVIM_LISTEN_ADDRESS environment variable before starting, like +4. Through a TCP/IP socket. To make nvim listen on a TCP/IP socket, you need +   to set the $NVIM_LISTEN_ADDRESS environment variable before starting, like     this:  >      NVIM_LISTEN_ADDRESS=127.0.0.1:6666 nvim  <  Connecting to the socket is the easiest way a programmer can test the API, -which can be done through any msgpack-rpc client library or a fully-featured -Nvim client(which we'll see below). Here's a ruby script that will print the +which can be done through any msgpack-rpc client library or fully-featured +Nvim client (which we'll see below). Here's a ruby script that will print the  string 'hello world!' on the current nvim instance:  >      #!/usr/bin/env ruby      # Requires msgpack-rpc: gem install msgpack-rpc -    #  -    # To run this script, execute it from a running nvim instance(notice the +    # +    # To run this script, execute it from a running nvim instance (notice the      # trailing '&' which is required since nvim won't process events while      # running a blocking command): -    #  +    #      #	:!./hello.rb &      #      # Or from another shell by setting NVIM_LISTEN_ADDRESS: @@ -120,15 +120,15 @@ functions can be called interactively:  4. Implementing new clients				  *msgpack-rpc-clients*  Nvim is still alpha and there's no in-depth documentation explaining how to -properly implement a client library. The python client(neovim pip package) -will be always up-to-date with the latest API changes, so it's source code is +properly implement a client library. The python client (neovim pip package) +will be always up-to-date with the latest API changes, so its source code is  the best documentation currently available. There are some guidelines however: -- Separate the transport layer from the rest of the library(See +- Separate the transport layer from the rest of the library (see    |msgpack-rpc-connecting| for details of how a client can connect to nvim).  - Use a msgpack library that implements the spec version 5, Nvim uses the    BIN/EXT types. -- Read api metadata in order to create client-side wrappers for all +- Read API metadata in order to create client-side wrappers for all    msgpack-rpc methods.  - Use a single-threaded event loop library/pattern.  - Use a fiber/coroutine library for the language you are implementing a client @@ -138,10 +138,10 @@ the best documentation currently available. There are some guidelines however:  - Don't assume anything about the order that responses to msgpack-rpc requests    will arrive.  - Clients should expect to receive msgpack-rpc requests, which need to be -  handled immediately since Nvim is blocked while waiting for the client +  handled immediately because Nvim is blocked while waiting for the client    response.  - Clients should expect to receive msgpack-rpc notifications, but these don't -  need to be handled immediately because they won't block Nvim(Though you +  need to be handled immediately because they won't block Nvim (though you    probably want to handle them immediately anyway). @@ -154,14 +154,14 @@ https://github.com/msgpack-rpc/msgpack-rpc-ruby/blob/master/lib/msgpack/rpc/tran  ==============================================================================  5. Types						    *msgpack-rpc-types* -Nvim's C API uses custom types for all functions(some are just typedefs +Nvim's C API uses custom types for all functions (some are just typedefs  around C99 standard types). The types can be split into two groups: -- Basic types that map natively to msgpack(and probably have a default +- Basic types that map natively to msgpack (and probably have a default    representation in msgpack-supported programming languages)  - Special Nvim types that map to msgpack EXT with custom type codes. -Basic type mapping:  +Basic type mapping:  Nil				  -> msgpack nil  Boolean				  -> msgpack boolean @@ -210,15 +210,15 @@ that makes this task easier:  - Each function metadata object has type information about the return value    and parameters. These can be used for generating strongly-typed APIs in    static languages. -- Container types may be decorated with type/size constraints, eg: +- Container types may be decorated with type/size constraints, e.g.    ArrayOf(Buffer) or ArrayOf(Integer, 2). This can be useful to generate even    more strongly-typed APIs.  - Methods that operate instances of Nvim's types are prefixed with the type -  name in lower case. Eg: `buffer_get_line` represents the `get_line` method +  name in lower case, e.g. `buffer_get_line` represents the `get_line` method    of a Buffer instance. -- Global methods are prefixed with `vim`. Eg: `vim_list_buffers` +- Global methods are prefixed with `vim`, e.g.`vim_list_buffers`. -So, for a object-oriented language, a client library would have the classes +So, for an object-oriented language, a client library would have the classes  that represent Nvim's types, and the methods of each class could be defined  by inspecting the method name prefix. There could also be a singleton Vim  class with methods mapped to functions prefixed with `vim_` @@ -228,15 +228,18 @@ class with methods mapped to functions prefixed with `vim_`  Four functions related to msgpack-rpc are available to vimscript: -- |rpcstart()|: Similarly to |jobstart()|, this will spawn a co-process with -  it's standard handles connected to Nvim, the difference is that it's not -  possible to process raw data to/from the process stdin/stdout/stderr(Since -  the job's stdin/stdout combo are used as a msgpack channel that is -  processed directly by Nvim C code). -- |rpcstop()|: Same as |jobstop()|, but operates on handles returned by -  |rpcstart()|. -- |rpcrequest()|: Sends a msgpack-rpc request to the process. -- |rpcnotify()|: Sends a msgpack-rpc notification to the process. +1. |rpcstart()|: Similarly to |jobstart()|, this will spawn a co-process with +   its standard handles connected to Nvim. The difference is that it's not +   possible to process raw data to/from the process stdin/stdout/stderr (since +   the job's stdin/stdout combo are used as a msgpack channel that is +   processed directly by Nvim C code). + +2. |rpcstop()|: Same as |jobstop()|, but operates on handles returned by +   |rpcstart()|. + +3. |rpcrequest()|: Sends a msgpack-rpc request to the process. + +4. |rpcnotify()|: Sends a msgpack-rpc notification to the process.  The last two functions may also be used with channels created from  connections to |$NVIM_LISTEN_ADDRESS|. | 
