module Yi.Boot (yi, yiDriver, reload) where
import qualified Config.Dyre as Dyre
import qualified Config.Dyre.Options as Dyre
import Config.Dyre.Relaunch
import Control.Monad.State
import Control.Monad.Base
import qualified Data.Rope as R
import System.Environment
import System.Exit
import Yi.Config
import Yi.Editor
import Yi.Keymap
import Yi.Main
import qualified Yi.UI.Common as UI
import Yi.Paths (getCustomConfigPath)
realMain :: (Config, ConsoleConfig) -> IO ()
realMain configs = do
editor <- restoreBinaryState Nothing
main configs editor
showErrorsInConf :: (Config, ConsoleConfig) -> String -> (Config, ConsoleConfig)
showErrorsInConf (conf, confcon) errs
= (conf { initialActions = makeAction (splitE >> newBufferE (Left "*errors*") (R.fromString errs)) : initialActions conf }
, confcon)
yi, yiDriver :: Config -> IO ()
yi = yiDriver
yiDriver cfg = do
args <- Dyre.withDyreOptions Dyre.defaultParams getArgs
case do_args cfg args of
Left (Err err code) ->
do 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"] ++
["-i" ++ modules] ++
#ifdef PROFILING
["-prof", "-auto-all", "-rtsopts", "-osuf=p_o", "-hisuf=p_hi"] ++
#endif
ghcOptions cfgcon
, Dyre.includeCurrentDirectory = False
}
Dyre.wrapMain yiParams (finalCfg, cfgcon)
reload :: YiM ()
reload = do
editor <- withEditor get
withUI (`UI.end` False)
liftBase $ relaunchWithBinaryState (Just editor) Nothing