@@ -113,7 +113,7 @@ ideslave orig mods
113 do let fn = case mods of
113 do let fn = case mods of
114 (f:_) -> f
114 (f:_) -> f
116− case parseCmd i cmd of
116+ case parseCmd i "(input)" cmd of
117 Left err -> iFail $ show err
117 Left err -> iFail $ show err
118 Right (Prove n') -> do iResult ""
118 Right (Prove n') -> do iResult ""
119 idrisCatch
119 idrisCatch
@@ -214,7 +214,7 @@ processInput cmd orig inputs
214 let fn = case inputs of
214 let fn = case inputs of
215 (f:_) -> f
215 (f:_) -> f
217− case parseCmd i cmd of
217+ case parseCmd i "(input)" cmd of
218 Left err -> do liftIO $ print err
218 Left err -> do liftIO $ print err
219 return (Just inputs)
219 return (Just inputs)
220 Right Reload ->
220 Right Reload ->
@@ -524,7 +524,10 @@ process fn (DynamicLink l) = do i <- getIState
524 case handle of
524 case handle of
525 Nothing -> iFail $ "Could not load dynamic lib \"" ++ l ++ "\""
525 Nothing -> iFail $ "Could not load dynamic lib \"" ++ l ++ "\""
526 Just x -> do let libs = idris_dynamic_libs i
526 Just x -> do let libs = idris_dynamic_libs i
528+ then do iLOG ("Tried to load duplicate library " ++ lib_name x)
527− putIState $ i { idris_dynamic_libs = x:libs }
530+ else putIState $ i { idris_dynamic_libs = x:libs }
528 where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
531 where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
529process fn ListDynamic = do i <- getIState
532process fn ListDynamic = do i <- getIState
530 iputStrLn "Dynamic libraries:"
533 iputStrLn "Dynamic libraries:"
@@ -655,8 +658,10 @@ helphead =
658−replSettings :: Settings Idris
661+replSettings :: Maybe FilePath -> Settings Idris
659−replSettings = setComplete replCompletion defaultSettings
662+replSettings hFile = setComplete replCompletion $ defaultSettings {
661-- invoke as if from command line
666-- invoke as if from command line
662idris :: [Opt] -> IO IState
667idris :: [Opt] -> IO IState
@@ -725,7 +730,7 @@ loadInputs inputs
726 ibc (IBC _ _) = True
731 ibc (IBC _ _) = True
727 ibc _ = False
732 ibc _ = False
729idrisMain :: [Opt] -> Idris ()
734idrisMain :: [Opt] -> Idris ()
730idrisMain opts =
735idrisMain opts =
731 do let inputs = opt getFile opts
736 do let inputs = opt getFile opts
@@ -794,7 +799,7 @@ idrisMain opts =
794 return ()
799 return ()
795 when (runrepl && not quiet && not idesl && not (isJust script)) $ iputStrLn banner
800 when (runrepl && not quiet && not idesl && not (isJust script)) $ iputStrLn banner
796 ist <- getIState
801 ist <- getIState
798 loadInputs inputs
803 loadInputs inputs
800 liftIO $ hSetBuffering stdout LineBuffering
805 liftIO $ hSetBuffering stdout LineBuffering
@@ -806,7 +811,11 @@ idrisMain opts =
806 case script of
811 case script of
807 Nothing -> return ()
812 Nothing -> return ()
808 Just expr -> execScript expr
813 Just expr -> execScript expr
815+ historyFile <- fmap (</> "repl" </> "history") getIdrisUserDataDir
817+ when runrepl $ initScript
809− when (runrepl && not idesl) $ runInputT replSettings $ repl ist inputs
818+ when (runrepl && not idesl) $ runInputT (replSettings (Just historyFile)) $ repl ist inputs
810 when (idesl) $ ideslaveStart ist inputs
819 when (idesl) $ ideslaveStart ist inputs
811 ok <- noErrors
820 ok <- noErrors
812 when (not ok) $ liftIO (exitWith (ExitFailure 1))
821 when (not ok) $ liftIO (exitWith (ExitFailure 1))
@@ -819,7 +828,7 @@ idrisMain opts =
819 makeOption _ = return ()
828 makeOption _ = return ()
821 addPkgDir :: String -> Idris ()
830 addPkgDir :: String -> Idris ()
822− addPkgDir p = do ddir <- liftIO $ getDataDir
831+ addPkgDir p = do ddir <- liftIO $ getDataDir
823 addImportDir (ddir </> p)
832 addImportDir (ddir </> p)
825execScript :: String -> Idris ()
834execScript :: String -> Idris ()
@@ -832,6 +841,43 @@ execScript expr = do i <- getIState
832 res <- execute tm
841 res <- execute tm
833 liftIO $ exitWith ExitSuccess
842 liftIO $ exitWith ExitSuccess
844+-- | Get the platform-specific, user-specific Idris dir
845+getIdrisUserDataDir :: Idris FilePath
846+getIdrisUserDataDir = liftIO $ getAppUserDataDirectory "idris"
848+-- | Locate the platform-specific location for the init script
849+getInitScript :: Idris FilePath
850+getInitScript = do idrisDir <- getIdrisUserDataDir
851+ return $ idrisDir </> "repl" </> "init"
853+-- | Run the initialisation script
854+initScript :: Idris ()
855+initScript = do script <- getInitScript
856+ idrisCatch (do go <- liftIO $ doesFileExist script
858+ h <- liftIO $ openFile script ReadMode
861+ (\e -> iFail $ "Error reading init file: " ++ show e)
862+ where runInit :: Handle -> Idris ()
863+ runInit h = do eof <- lift (hIsEOF h)
866+ line <- liftIO $ hGetLine h
867+ script <- getInitScript
868+ processLine ist line script
870+ processLine i cmd input =
871+ case parseCmd i input cmd of
872+ Left err -> liftIO $ print err
873+ Right Reload -> iFail "Init scripts cannot reload the file"
874+ Right (Load f) -> iFail "Init scripts cannot load files"
875+ Right (ModImport f) -> iFail "Init scripts cannot import modules"
876+ Right Edit -> iFail "Init scripts cannot invoke the editor"
877+ Right Proofs -> proofs i
878+ Right Quit -> iFail "Init scripts cannot quit Idris"
879+ Right cmd -> process [] cmd
835getFile :: Opt -> Maybe String
881getFile :: Opt -> Maybe String
836getFile (Filename str) = Just str
882getFile (Filename str) = Just str
837getFile _ = Nothing
883getFile _ = Nothing