@@ -113,7 +113,7 @@ ideslave orig mods
113113 do let fn = case mods of
114114 (f:_) -> f
115115 _ -> ""
116− case parseCmd i cmd of
116+ case parseCmd i "(input)" cmd of
117117 Left err -> iFail $ show err
118118 Right (Prove n') -> do iResult ""
119119 idrisCatch
@@ -214,7 +214,7 @@ processInput cmd orig inputs
214214 let fn = case inputs of
215215 (f:_) -> f
216216 _ -> ""
217− case parseCmd i cmd of
217+ case parseCmd i "(input)" cmd of
218218 Left err -> do liftIO $ print err
219219 return (Just inputs)
220220 Right Reload ->
@@ -524,7 +524,10 @@ process fn (DynamicLink l) = do i <- getIState
524524 case handle of
525525 Nothing -> iFail $ "Could not load dynamic lib \"" ++ l ++ "\""
526526 Just x -> do let libs = idris_dynamic_libs i
527− putIState $ i { idris_dynamic_libs = x:libs }
527+ if x `elem` libs
528+ then do iLOG ("Tried to load duplicate library " ++ lib_name x)
529+ return ()
530+ else putIState $ i { idris_dynamic_libs = x:libs }
528531 where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
529532process fn ListDynamic = do i <- getIState
530533 iputStrLn "Dynamic libraries:"
@@ -655,8 +658,10 @@ helphead =
655658 ]
656659
657660
658−replSettings :: Settings Idris
659−replSettings = setComplete replCompletion defaultSettings
661+replSettings :: Maybe FilePath -> Settings Idris
662+replSettings hFile = setComplete replCompletion $ defaultSettings {
663+ historyFile = hFile
664+ }
660665
661666-- invoke as if from command line
662667idris :: [Opt] -> IO IState
@@ -725,7 +730,7 @@ loadInputs inputs
725730
726731 ibc (IBC _ _) = True
727732 ibc _ = False
728−
733+
729734idrisMain :: [Opt] -> Idris ()
730735idrisMain opts =
731736 do let inputs = opt getFile opts
@@ -794,7 +799,7 @@ idrisMain opts =
794799 return ()
795800 when (runrepl && not quiet && not idesl && not (isJust script)) $ iputStrLn banner
796801 ist <- getIState
797−
802+
798803 loadInputs inputs
799804
800805 liftIO $ hSetBuffering stdout LineBuffering
@@ -806,7 +811,11 @@ idrisMain opts =
806811 case script of
807812 Nothing -> return ()
808813 Just expr -> execScript expr
809− when (runrepl && not idesl) $ runInputT replSettings $ repl ist inputs
814+
815+ historyFile <- fmap (</> "repl" </> "history") getIdrisUserDataDir
816+
817+ when runrepl $ initScript
818+ when (runrepl && not idesl) $ runInputT (replSettings (Just historyFile)) $ repl ist inputs
810819 when (idesl) $ ideslaveStart ist inputs
811820 ok <- noErrors
812821 when (not ok) $ liftIO (exitWith (ExitFailure 1))
@@ -819,7 +828,7 @@ idrisMain opts =
819828 makeOption _ = return ()
820829
821830 addPkgDir :: String -> Idris ()
822− addPkgDir p = do ddir <- liftIO $ getDataDir
831+ addPkgDir p = do ddir <- liftIO $ getDataDir
823832 addImportDir (ddir </> p)
824833
825834execScript :: String -> Idris ()
@@ -832,6 +841,43 @@ execScript expr = do i <- getIState
832841 res <- execute tm
833842 liftIO $ exitWith ExitSuccess
834843
844+-- | Get the platform-specific, user-specific Idris dir
845+getIdrisUserDataDir :: Idris FilePath
846+getIdrisUserDataDir = liftIO $ getAppUserDataDirectory "idris"
847+
848+-- | Locate the platform-specific location for the init script
849+getInitScript :: Idris FilePath
850+getInitScript = do idrisDir <- getIdrisUserDataDir
851+ return $ idrisDir </> "repl" </> "init"
852+
853+-- | Run the initialisation script
854+initScript :: Idris ()
855+initScript = do script <- getInitScript
856+ idrisCatch (do go <- liftIO $ doesFileExist script
857+ when go $ do
858+ h <- liftIO $ openFile script ReadMode
859+ runInit h
860+ liftIO $ hClose h)
861+ (\e -> iFail $ "Error reading init file: " ++ show e)
862+ where runInit :: Handle -> Idris ()
863+ runInit h = do eof <- lift (hIsEOF h)
864+ ist <- getIState
865+ unless eof $ do
866+ line <- liftIO $ hGetLine h
867+ script <- getInitScript
868+ processLine ist line script
869+ runInit h
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
880+
835881getFile :: Opt -> Maybe String
836882getFile (Filename str) = Just str
837883getFile _ = Nothing