@@ -1,7 +1,9 @@
1module Idris.REPLParser(parseCmd) where
1module Idris.REPLParser(parseCmd) where
3import System.FilePath ((</>))
3import System.FilePath ((</>))
4+import System.Console.ANSI (Color(..))
5import Idris.Parser
7import Idris.Parser
6import Idris.AbsSyntax
8import Idris.AbsSyntax
7import Core.TT
9import Core.TT
@@ -14,6 +16,7 @@ import qualified Text.ParserCombinators.Parsec.Token as PTok
14import Debug.Trace
16import Debug.Trace
15import Data.List
17import Data.List
16import Data.List.Split(splitOn)
18import Data.List.Split(splitOn)
19+import Data.Char(toLower)
18parseCmd i = runParser pCmd i "(input)"
21parseCmd i = runParser pCmd i "(input)"
@@ -57,6 +60,7 @@ pCmd = do spaces; try (do cmd ["q", "quit"]; eof; return Quit)
57 <|> try (do cmd ["miss", "missing"]; n <- pfName; eof; return (Missing n))
60 <|> try (do cmd ["miss", "missing"]; n <- pfName; eof; return (Missing n))
58 <|> try (do cmd ["dynamic"]; eof; return ListDynamic)
61 <|> try (do cmd ["dynamic"]; eof; return ListDynamic)
59 <|> try (do cmd ["dynamic"]; l <- getInput; return (DynamicLink l))
62 <|> try (do cmd ["dynamic"]; l <- getInput; return (DynamicLink l))
63+ <|> try (do cmd ["color", "colour"]; pSetColourCmd)
60 <|> try (do cmd ["set"]; o <-pOption; return (SetOpt o))
64 <|> try (do cmd ["set"]; o <-pOption; return (SetOpt o))
61 <|> try (do cmd ["unset"]; o <-pOption; return (UnsetOpt o))
65 <|> try (do cmd ["unset"]; o <-pOption; return (UnsetOpt o))
62 <|> try (do cmd ["s", "search"]; whiteSpace; t <- pFullExpr defaultSyntax; return (Search t))
66 <|> try (do cmd ["s", "search"]; whiteSpace; t <- pFullExpr defaultSyntax; return (Search t))
@@ -71,3 +75,55 @@ pOption :: IParser Opt
71pOption = do discard (symbol "errorcontext"); return ErrContext
75pOption = do discard (symbol "errorcontext"); return ErrContext
72 <|> do discard (symbol "showimplicits"); return ShowImpl
76 <|> do discard (symbol "showimplicits"); return ShowImpl
79+colours :: [(String, Color)]
80+colours = [ ("black", Black)
85+ , ("magenta", Magenta)
90+pColour :: IParser Color
91+pColour = doColour colours
92+ where doColour [] = fail "Unknown colour"
93+ doColour ((s, c):cs) = (try (symbol s) >> return c) <|> doColour cs
95+pColourMod :: IParser (IdrisColour -> IdrisColour)
96+pColourMod = try (symbol "vivid" >> return doVivid)
97+ <|> try (symbol "dull" >> return doDull)
98+ <|> try (symbol "underline" >> return doUnderline)
99+ <|> try (symbol "nounderline" >> return doNoUnderline)
100+ <|> try (symbol "bold" >> return doBold)
101+ <|> try (symbol "nobold" >> return doNoBold)
102+ <|> try (pColour >>= return . doSetColour)
103+ where doVivid i = i { vivid = True }
104+ doDull i = i { vivid = False }
105+ doUnderline i = i { underline = True }
106+ doNoUnderline i = i { underline = False }
107+ doBold i = i { bold = True }
108+ doNoBold i = i { bold = False }
109+ doSetColour c i = i { colour = c }
112+colourTypes :: [(String, ColourType)]
113+colourTypes = map (\x -> ((map toLower . reverse . drop 6 . reverse . show) x, x)) $
114+ enumFromTo minBound maxBound
116+pColourType :: IParser ColourType
117+pColourType = doColourType colourTypes
118+ where doColourType [] = fail $ "Unknown colour category. Options: " ++
119+ (concat . intersperse ", " . map fst) colourTypes
120+ doColourType ((s,ct):cts) = (try (symbol s) >> return ct) <|> doColourType cts
122+pSetColourCmd :: IParser Command
123+pSetColourCmd = (do c <- pColourType
124+ let defaultColour = IdrisColour Black True False False
125+ opts <- sepBy pColourMod spaces
126+ let colour = foldr ($) defaultColour $ reverse opts
127+ return $ SetColour c colour)
128+ <|> try (symbol "on" >> return ColourOn)
129+ <|> try (symbol "off" >> return ColourOff)