module Yi.Boot (configMain, yi, yiDriver, yiDriver', reload) where
import qualified Config.Dyre as Dyre
import qualified Config.Dyre.Options as Dyre
import qualified Config.Dyre.Params as Dyre
import Config.Dyre.Relaunch
import Control.Monad.State hiding (modify, get)
import Lens.Micro.Platform
import Data.Text ()
import qualified Data.Text.IO as T (putStrLn)
import System.Environment
import System.Exit
import Yi.Boot.Internal
import Yi.Buffer.Misc (BufferId(..))
import Yi.Config
import Yi.Config.Simple.Types
import Yi.Editor
import Yi.Keymap
import Yi.Main
import Yi.Option (OptionError(..))
import Yi.Paths (getCustomConfigPath)
import Yi.Rope (fromString)
realMain :: (Config, ConsoleConfig) -> IO ()
realMain configs = restoreBinaryState Nothing >>= main configs
showErrorsInConf :: (Config, ConsoleConfig) -> String -> (Config, ConsoleConfig)
showErrorsInConf c errs = c & _1 . initialActionsA %~ (makeAction openErrBuf :)
where
openErrBuf = splitE >> newBufferE (MemBuffer "*errors*") (fromString errs)
configMain :: Config -> ConfigM () -> IO ()
configMain c m = yi =<< execStateT (runConfigM m) c
yi :: Config -> IO ()
yi = yiDriver
yiDriver :: Config -> IO ()
yiDriver = yiDriver' False
yiDriver' :: Bool -> Config -> IO ()
yiDriver' ignoreUnknownArgs cfg = do
args <- Dyre.withDyreOptions Dyre.defaultParams getArgs
case do_args ignoreUnknownArgs cfg args of
Left (OptionError err code) -> T.putStrLn err >> exitWith code
Right (finalCfg, cfgcon) -> do
modules <- getCustomConfigPath (userConfigDir cfgcon) "modules"
let yiParams = Dyre.defaultParams
{ Dyre.projectName = "yi"
, Dyre.realMain = realMain
, Dyre.showError = showErrorsInConf
, Dyre.configDir = Just $ userConfigDir cfgcon
, Dyre.ghcOpts = ["-threaded", "-O2", "-rtsopts"]
++ ["-i" ++ modules]
++ profilingParams
++ ghcOptions cfgcon
, Dyre.includeCurrentDirectory = False
, Dyre.rtsOptsHandling = Dyre.RTSAppend ["-I5"]
}
Dyre.wrapMain yiParams (finalCfg, cfgcon)
profilingParams :: [String]
profilingParams =
#ifdef EVENTLOG
["-eventlog", "-rtsopts"] ++
#endif
#ifdef PROFILING
["-prof", "-auto-all", "-rtsopts"
, "-osuf=p_o", "-hisuf=p_hi"] ++
#endif
[]