module Yi.Config.Users.Gwern (config) where

import Control.Lens
import Yi
import Yi.Hoogle (hoogle)
import Yi.Keymap.Emacs (defKeymap, _eKeymap, mkKeymap)
import qualified Yi.Mode.Haskell as H
import qualified Yi.Mode.IReader as IReader (ireaderMode)

config :: Config
config = defaultEmacsConfig
 { modeTable = AnyMode bestHaskellMode : AnyMode IReader.ireaderMode : modeTable defaultConfig,
   -- Keymap Configuration
   defaultKm = myKeymap,
   configUI = defaultUIConfig {configFontSize = Nothing, configWindowFill = ' '} }
    where defaultUIConfig :: UIConfig
          defaultUIConfig = configUI defaultConfig
          -- bestHaskellMode :: Mode (Tree (Tok Token))
          bestHaskellMode = -- Shim.minorMode $
                             H.cleverMode { 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])
                                                   <||) }

myKeymap :: KeymapSet
myKeymap = mkKeymap $ override Yi.Keymap.Emacs.defKeymap $ \proto _self ->
   proto { _eKeymap = _eKeymap proto ||>
           -- Add a M-g binding for goto-line
           (metaCh 'g' ?>>! gotoLn)
           -- Use a more clever binding for Home
           ||> (spec KHome ?>>! moveNonspaceOrSol) }