module Yi.Config.Users.Anders (config, main) where
import           Control.Lens
import           Data.Monoid
import           Yi hiding (Block)
import           Yi.Hoogle (hoogle)
import           Yi.Lexer.Haskell (TT)
import qualified Yi.Mode.Haskell as H
import qualified Yi.Rope as R
import           Yi.String (mapLines)
import           Yi.Syntax.Haskell (Tree)
config :: Config
config = defaultEmacsConfig
increaseIndent :: BufferM ()
increaseIndent = do
  r <- getSelectRegionB
  r' <- unitWiseRegion Yi.Line r
     
  modifyRegionB (mapLines $ R.cons ' ') r'
     
main :: IO ()
main = yi $ config
  { defaultKm = defaultKm config
  , startFrontEnd = startFrontEnd config
  , modeTable =
    
    AnyMode (haskellModeHooks H.preciseMode)
    
    : AnyMode (haskellModeHooks noAnnots)
    : modeTable defaultConfig
  }
haskellModeHooks :: Mode syntax -> Mode syntax
haskellModeHooks mode =
   mode { modeName = "my " <> modeName mode
        , modeKeymap =
            topKeymapA %~ ((ctrlCh 'c' ?>>
                            choice [ ctrlCh 'l' ?>>! H.ghciLoadBuffer
                                   , ctrl (char 'z') ?>>! H.ghciGet
                                   , ctrl (char 'h') ?>>! hoogle
                                   , ctrlCh 'r' ?>>! H.ghciSend ":r"
                                   , ctrlCh 't' ?>>! H.ghciInferType
                                   , ctrlCh 'n' ?>>! increaseIndent
                                   ])
                           <||) }
noAnnots :: Mode (Tree TT)
noAnnots = H.preciseMode {modeName = "preciseNoUnicode"}