nvim-hs-0.0.6: Haskell plugin backend for neovim

PortabilityGHC
Stabilityexperimental
Maintainerwoozletoff@gmail.com
Safe HaskellNone

Neovim.Context.Internal

Description

To shorten function and data type names, import this qualfied as Internal.

Synopsis

Documentation

newtype Neovim r st a Source

This is the environment in which all plugins are initially started. Stateless functions use '()' for the static configuration and the mutable state and there is another type alias for that case: Neovim'.

Functions have to run in this transformer stack to communicate with neovim. If parts of your own functions dont need to communicate with neovim, it is good practice to factor them out. This allows you to write tests and spot errors easier. Essentially, you should treat this similar to IO in general haskell programs.

Constructors

Neovim 

Fields

unNeovim :: ResourceT (StateT st (ReaderT (Config r st) IO)) a
 

Instances

MonadBase IO (Neovim r st) 
MonadReader r (Neovim r st)

User facing instance declaration for the reader state.

MonadState st (Neovim r st) 
Monad (Neovim r st) 
Functor (Neovim r st) 
Applicative (Neovim r st) 
MonadIO (Neovim r st) 
MonadThrow (Neovim r st) 
MonadMask (Neovim r st) 
MonadCatch (Neovim r st) 
MonadResource (Neovim r st) 

ask' :: Neovim r st (Config r st)Source

Same as ask for the InternalConfig.

asks' :: (Config r st -> a) -> Neovim r st aSource

Same as asks for the InternalConfig.

type Neovim' = Neovim () ()Source

Convenience alias for Neovim () ().

data NeovimException Source

Exceptions specific to nvim-hs.

Constructors

ErrorMessage Doc

Simply error message that is passed to neovim. It should currently only contain one line of text.

runNeovim :: Config r st -> st -> Neovim r st a -> IO (Either Doc (a, st))Source

Initialize a Neovim context by supplying an InternalEnvironment.

forkNeovim :: ir -> ist -> Neovim ir ist a -> Neovim r st ThreadIdSource

Fork a neovim thread with the given custom config value and a custom state. The result of the thread is discarded and only the ThreadId is returend immediately. FIXME This function is pretty much unused and mayhave undesired effects, namely that you cannot register autocmds in the forked thread.

newUniqueFunctionName :: Neovim r st FunctionNameSource

Create a new unique function name. To prevent possible name clashes, digits are stripped from the given suffix.

data FunctionType Source

This data type is used to dispatch a remote function call to the appopriate recipient.

Constructors

Stateless ([Object] -> Neovim' Object)

Stateless functions are simply executed with the sent arguments.

Stateful (TQueue SomeMessage)

Stateful functions are handled within a special thread, the TQueue is the communication endpoint for the arguments we have to pass.

Instances

Pretty FunctionType 

type FunctionMapEntry = (FunctionalityDescription, FunctionType)Source

Type of the values stored in the function map.

type FunctionMap = Map FunctionName FunctionMapEntrySource

A function map is a map containing the names of functions as keys and some context dependent value which contains all the necessary information to execute that function in the intended way.

This type is only used internally and handles two distinct cases. One case is a direct function call, wich is simply a function that accepts a list of Object values and returns a result in the Neovim context. The second case is calling a function that has a persistent state. This is mediated to a thread that reads from a TQueue. (NB: persistent currently means, that state is stored for as long as the plugin provider is running and not restarted.)

mkFunctionMap :: [FunctionMapEntry] -> FunctionMapSource

Create a new function map from the given list of FunctionMapEntry values.

data Config r st Source

A wrapper for a reader value that contains extra fields required to communicate with the messagepack-rpc components and provide necessary data to provide other globally available operations.

Note that you most probably do not want to change the fields prefixed with an underscore.

Constructors

Config 

Fields

eventQueue :: TQueue SomeMessage

A queue of messages that the event handler will propagate to appropriate threads and handlers.

transitionTo :: MVar StateTransition

The main thread will wait for this MVar to be filled with a value and then perform an action appropriate for the value of type StateTransition.

providerName :: TMVar (Either String Int)

Since nvim-hs must have its Neovim.RPC.SocketReader and Neovim.RPC.EventHandler running to determine the actual channel id (i.e. the Int value here) this field can only be set properly later. Hence, the value of this field is put in an TMVar. Name that is used to identify this provider. Assigning such a name is done in the neovim config (e.g. ~/.nvim/nvimrc).

uniqueCounter :: TVar Integer

This TVar is used to generate uniqe function names on the side of nvim-hs. This is useful if you don't want to overwrite existing functions or if you create autocmd functions.

globalFunctionMap :: TMVar FunctionMap

This map is used to dispatch received messagepack function calls to it's appropriate targets.

pluginSettings :: Maybe (PluginSettings r st)

In a registered functionality this field contains a function (and possibly some context dependent values) to register new functionality.

customConfig :: r

Plugin author supplyable custom configuration. Queried on the user-facing side with ask or asks.

retypeConfig :: r -> st -> Config anotherR anotherSt -> Config r stSource

Convenient helper to create a new config for the given state and read-only config.

Sets the pluginSettings field to Nothing.

data PluginSettings r st whereSource

This GADT is used to share informatino between stateless and stateful plugin threads since they work fundamentally in the same way. They both contain a function to register some functionality in the plugin provider as well as some values which are specific to the one or the other context.

newConfig :: IO (Maybe String) -> IO r -> IO (Config r context)Source

Create a new InternalConfig object by providing the minimal amount of necessary information.

This function should only be called once per nvim-hs session since the arguments are shared across processes.

data StateTransition Source

The state that the plugin provider wants to transition to.

Constructors

Quit

Quit the plugin provider.

Restart

Restart the plugin provider.

Failure Doc

The plugin provider failed to start or some other error occured.

InitSuccess

The plugin provider started successfully.