packages feed

ribosome-0.9.9.9: lib/Ribosome/Api/Autocmd.hs

-- |Autocmd functions.
module Ribosome.Api.Autocmd (
  module Ribosome.Api.Autocmd,
  autocmd,
) where

import Data.MessagePack (Object)

import Ribosome.Host.Api.Autocmd (autocmd)
import Ribosome.Host.Api.Data (Buffer)
import Ribosome.Host.Api.Effect (bufferGetNumber, nvimExecAutocmds, vimGetOption, vimSetOption)
import Ribosome.Host.Class.Msgpack.Encode (toMsgpack)
import Ribosome.Host.Data.RpcType (AutocmdBuffer (AutocmdBuffer), AutocmdEvents, AutocmdId, AutocmdOptions, target)
import qualified Ribosome.Host.Effect.Rpc as Rpc
import Ribosome.Host.Effect.Rpc (Rpc)

-- |Trigger a set of autocmds.
--
-- Same as 'nvimExecAutocmds', but specializing the parameter type.
doautocmdWith ::
  Member Rpc r =>
  AutocmdEvents ->
  Map Text Object ->
  Sem r ()
doautocmdWith =
  nvimExecAutocmds

-- |Trigger a set of autocmds.
doautocmd ::
  Member Rpc r =>
  AutocmdEvents ->
  Sem r ()
doautocmd events =
  nvimExecAutocmds events mempty

-- |Trigger a user autocmd.
uautocmd ::
  Member Rpc r =>
  Text ->
  Sem r ()
uautocmd name =
  doautocmdWith "User" [("pattern", toMsgpack name)]

-- |Execute an action with all autocmds disabled.
eventignore ::
  Members [Rpc, Resource] r =>
  Sem r a ->
  Sem r a
eventignore =
  bracket getAndSet restore . const
  where
    getAndSet = do
      previous :: Text <- vimGetOption "eventignore"
      vimSetOption "eventignore" ("all" :: Text)
      pure previous
    restore =
      vimSetOption "eventignore"

-- |Create an autocmd in a buffer.
bufferAutocmd ::
  Member Rpc r =>
  Buffer ->
  AutocmdEvents ->
  AutocmdOptions ->
  -- |Command to execute when the autocmd triggers.
  Text ->
  Sem r AutocmdId
bufferAutocmd buf events options cmd = do
  number <- bufferGetNumber buf
  Rpc.sync do
    autocmd events options { target = Left (AutocmdBuffer number) } cmd