Module Vcaml
module Internal = Nvim_internal
module Client_info : sig ... end
module Channel_info : sig ... end
module Nvim_command : sig ... end
module Keymap : sig ... end
module Buf : sig ... end
module Window : sig ... end
module Tabpage : sig ... end
module Client : sig ... end
module Type : sig ... end
A
Type.t
is a reified values of a primitive type used in nvim.
type 'a api_call
= 'a Api_call.t
A
'a api_call
is a thunked call to neovim returning a Msgpack-encoded'a
. No RPC traffic is generated until anapi_call
is invoked viarun
orrun_join
.api_call
's can be manipulated with an applicative-like interface.A good mental model is that invoking a
'a api_call
should cause exactly one RPC message to be sent to the neovim client, and that any operations within will not be interrupted. Calls with side effects will occur in the order written, solet%map _a = a and _b = b in ()
will cause neovim to first run
a
and thenb
.This is important for applications that rely on manipulating neovim's internal state. In particular, the atomicity guarantee prevents races with other pending operations, including user input.
You can run an
Api_call.t
withrun
orrun_join
.
module Api_call : sig ... end
val run : Client.t -> 'a api_call -> 'a Core.Or_error.t Async.Deferred.t
val run_join : Client.t -> 'a Core.Or_error.t api_call -> 'a Core.Or_error.t Async.Deferred.t
module Property : sig ... end
Contains a getter and setter for a given variable or property.
module Defun : sig ... end
val wrap_viml_function : type_:('fn, 'leftmost, 'out) Defun.Vim.t -> function_name:string -> 'fn
Given the name of a function available in vimscript (VimL) along with its arity (see
Defun.Vim
), return a regularly-typed OCaml function that calls said function.This is intended for client authors to delegate work back to neovim, possibly to call an existing vimscript function. Before reaching for this function, please check the functions available in
Neovim
,Buf
,Window
andTabpage
to see that the functionality you intend to wrap isn't directly exposed in the API.
val wrap_var : name:string -> type_:'a Type.t -> 'a Property.t
val wrap_option : name:string -> type_:'a Type.t -> 'a Property.t
val wrap_get_vvar : name:string -> type_:'a Type.t -> 'a Core.Or_error.t api_call
val register_request_blocking : Client.t -> name:string -> type_:('fn, 'leftmost) Defun.Ocaml.Sync.t -> f:'fn -> unit Core.Or_error.t
Register a function callable from neovim. Note that this does not define the function in vimL itself, but instead adds a listener to the neovim msgpack_rpc bus. Such functions can be invoked from neovim via
rpcrequest
orrpcnotify
along the correct channel. This is so that library wrappers can choose how to implement the actual vimL functions as needed.A synchronous request sends a request to the OCaml program, and then blocks on receiving a response. This can cause deadlocks if said request itself attempts to perform neovim operations, so synchronous functions should run as quickly as possible without binding on any
Deferred
s. This is enforced by the definition ofDefun.Sync.Type
.Asynchronous requests cannot directly return values to neovim, but do not block neovim while running. This can be used to indirectly update neovim by, for example, calling another neovim function within the handler (which can itself send another async request, etc).
val register_request_async : Client.t -> name:string -> type_:'fn Defun.Ocaml.Async.t -> f:'fn -> unit
val convert_msgpack_response : 'a Type.t -> Msgpack.t Core.Or_error.t api_call -> 'a Core.Or_error.t api_call