module Yi.Mode.Compilation where
import Control.Monad
import Control.Lens
import Yi.Core
import Yi.File (editFile)
import Yi.Lexer.Alex (Tok(..), Posn(..))
import Yi.Style
import Yi.Modes (linearSyntaxMode)
import qualified Yi.Lexer.Compilation as Compilation
import qualified Yi.Syntax.OnlineTree as OnlineTree
mode :: Mode (OnlineTree.Tree (Tok Compilation.Token))
mode = (linearSyntaxMode Compilation.initState Compilation.alexScanToken tokenToStyle)
{
modeApplies = modeNeverApplies,
modeName = "compilation",
modeKeymap = topKeymapA %~ ((spec KEnter ?>>! withSyntax modeFollow) <||),
modeFollow = YiA . follow
}
where tokenToStyle _ = commentStyle
follow errs = do
point <- withBuffer pointB
case OnlineTree.tokAtOrBefore point errs of
Just (t@Tok {tokT = Compilation.Report filename line col _message}) -> do
withBuffer $ moveTo $ posnOfs $ tokPosn t
shiftOtherWindow
void $ editFile filename
withBuffer $ do
void $ gotoLn line
rightN col
_ -> return ()