packages feed

cornelis-0.2.0.0: src/Cornelis/Config.hs

{-# LANGUAGE OverloadedStrings #-}

module Cornelis.Config where

import           Cornelis.Types
import           Cornelis.Utils (objectToInt, objectToText)
import           Data.Maybe (fromMaybe)
import qualified Data.Text as T
import           Neovim
import           Neovim.API.Text
import           Control.Monad ((<=<))


------------------------------------------------------------------------------
-- | Attempt to get a variable from vim.
getVar :: Text -> Neovim env (Maybe Object)
getVar v
  = catchNeovimException (Just <$> vim_get_var v)
  $ const
  $ pure Nothing


------------------------------------------------------------------------------
-- | Get the first variable from vim that succeeds. Useful for variable names
-- that have changed over time.
getVarWithAlternatives :: [Text] -> Neovim env (Maybe Object)
getVarWithAlternatives = fmap getFirst . foldMap (fmap First . getVar)


------------------------------------------------------------------------------
-- | Build a 'CornelisConfig' from .vimrc
getConfig :: Neovim env CornelisConfig
getConfig
  = CornelisConfig
    <$> fmap (fromMaybe 31 . (objectToInt =<<))
        (getVar "cornelis_max_size")
    <*> fmap (fromMaybe 31 . (objectToInt =<<))
        (getVar "cornelis_max_width")
    <*> (fromMaybe Horizontal . (>>= (readSplitLocation . T.unpack <=< objectToText)) <$>
        getVarWithAlternatives ["cornelis_split_location", "cornelis_split_direction"])