yi-0.8.0: src/library/Yi/Mode/GHCi.hs
-- | a mode for GHCi, implemented as tweaks on Interaction mode
module Yi.Mode.GHCi where
import Control.Lens
import Data.List (elemIndex)
import Yi.Core
import Yi.Lexer.Alex (Tok)
import Yi.Lexer.Compilation (Token())
import qualified Yi.Syntax.OnlineTree as OnlineTree
import qualified Yi.Mode.Interactive as I
mode :: Mode (OnlineTree.Tree (Tok Token))
mode = I.mode
{ modeName = "ghci",
modeKeymap = (topKeymapA %~ (choice [spec KHome ?>>! homeKey] <||)) . modeKeymap I.mode
}
-- | The GHCi prompt always begins with ">"; this goes to just before it, or if one is already at the start
-- of the prompt, goes to the beginning of the line. (If at the beginning of the line, this pushes you forward to it.)
homeKey :: BufferM ()
homeKey = do l <- readLnB
let epos = elemIndex '>' l
case epos of
Nothing -> moveToSol
Just pos -> do (_,mypos) <- getLineAndCol
if mypos == (pos+2) then moveToSol
else moveToSol >> moveXorEol (pos+2)
spawnProcess :: FilePath -> [String] -> YiM BufferRef
spawnProcess = I.spawnProcessMode mode