module Yi.Mode.GHCi where
import Control.Lens
import Data.Binary
import Data.Default
#if __GLASGOW_HASKELL__ < 708
import Data.DeriveTH
#else
import GHC.Generics (Generic)
#endif
import Data.Text ()
import qualified Data.Text as T
import Data.Typeable
import Yi.Buffer
import Yi.Types (YiVariable)
import Yi.Keymap
import Yi.Keymap.Keys
import Yi.Lexer.Alex (Tok)
import Yi.Lexer.Compilation (Token())
import qualified Yi.Mode.Interactive as I
import qualified Yi.Rope as R
import Yi.Syntax.OnlineTree (Tree)
data GhciProcessName = GhciProcessName
{ _ghciProcessName :: FilePath
, _ghciProcessArgs :: [String]
} deriving (Typeable, Show)
instance Default GhciProcessName where
def = GhciProcessName { _ghciProcessName = "ghci"
, _ghciProcessArgs = []
}
#if __GLASGOW_HASKELL__ < 708
$(derive makeBinary ''GhciProcessName)
#else
deriving instance Generic GhciProcessName
instance Binary GhciProcessName
#endif
makeLenses ''GhciProcessName
instance YiVariable GhciProcessName
mode :: Mode (Tree (Tok Token))
mode = I.mode
& modeNameA .~ "ghci"
& modeKeymapA .~ topKeymapA %~ important (spec KHome ?>>! homeKey)
homeKey :: BufferM ()
homeKey = readLnB >>= \l -> case T.findIndex ('>' ==) (R.toText l) of
Nothing -> moveToSol
Just pos -> do
(_,mypos) <- getLineAndCol
moveToSol >> if mypos == (pos + 2)
then return ()
else moveXorEol (pos + 2)
spawnProcess :: FilePath
-> [String]
-> YiM BufferRef
spawnProcess = I.spawnProcessMode mode