@@ -27,13 +27,14 @@ import Control.Monad.Trans.State.Strict
28import Data.List (intercalate, isPrefixOf, nub, sortBy)
28import Data.List (intercalate, isPrefixOf, nub, sortBy)
29import Data.Maybe (mapMaybe)
29import Data.Maybe (mapMaybe)
30+import Data.Foldable (traverse_)
30import Data.Traversable (traverse)
31import Data.Traversable (traverse)
31import Data.Version (showVersion)
32import Data.Version (showVersion)
33import Parser
34import Parser
35import System.Console.Haskeline
36import System.Console.Haskeline
36−import System.Directory (doesFileExist, findExecutable, getHomeDirectory)
37+import System.Directory (doesFileExist, findExecutable, getHomeDirectory, getCurrentDirectory)
37import System.Exit
38import System.Exit
38import System.Environment.XDG.BaseDir
39import System.Environment.XDG.BaseDir
39import System.FilePath ((</>), isPathSeparator)
40import System.FilePath ((</>), isPathSeparator)
@@ -45,7 +46,7 @@ import Text.Parsec (ParseError)
45import qualified Data.Map as M
46import qualified Data.Map as M
46import qualified Language.PureScript as P
47import qualified Language.PureScript as P
47import qualified Paths_purescript as Paths
48import qualified Paths_purescript as Paths
48−import qualified System.IO.UTF8 as U (readFile)
49+import qualified System.IO.UTF8 as U (print, readFile)
51-- The PSCI state.
52-- The PSCI state.
@@ -289,11 +290,25 @@ inputFiles :: Cmd.Term [FilePath]
289inputFiles = Cmd.value $ Cmd.posAny [] $ Cmd.posInfo { Cmd.posName = "file(s)"
290inputFiles = Cmd.value $ Cmd.posAny [] $ Cmd.posInfo { Cmd.posName = "file(s)"
290 , Cmd.posDoc = "Optional .purs files to load on start" }
291 , Cmd.posDoc = "Optional .purs files to load on start" }
293+loadUserConfig :: IO (Maybe [Command])
295+ configFile <- (</> ".psci") <$> getCurrentDirectory
296+ exists <- doesFileExist configFile
299+ ls <- lines <$> U.readFile configFile
300+ case mapM parseCommand ls of
301+ Left err -> U.print err >> exitFailure
302+ Right cs -> return $ Just cs
293-- The PSCI main loop.
307-- The PSCI main loop.
295loop :: [FilePath] -> IO ()
309loop :: [FilePath] -> IO ()
296loop files = do
310loop files = do
311+ config <- loadUserConfig
297 preludeFilename <- getPreludeFilename
312 preludeFilename <- getPreludeFilename
298 modulesOrFirstError <- fmap concat . sequence <$> mapM loadModule (preludeFilename : files)
313 modulesOrFirstError <- fmap concat . sequence <$> mapM loadModule (preludeFilename : files)
299 case modulesOrFirstError of
314 case modulesOrFirstError of
@@ -303,6 +318,7 @@ loop files = do
303 let settings = defaultSettings {historyFile = Just historyFilename}
318 let settings = defaultSettings {historyFile = Just historyFilename}
304 flip evalStateT (PSCiState (preludeFilename : files) defaultImports modules []) . runInputT (setComplete completion settings) $ do
319 flip evalStateT (PSCiState (preludeFilename : files) defaultImports modules []) . runInputT (setComplete completion settings) $ do
305 outputStrLn prologueMessage
320 outputStrLn prologueMessage
321+ traverse_ (mapM_ handleCommand) config
308 go :: InputT (StateT PSCiState IO) ()
324 go :: InputT (StateT PSCiState IO) ()