packages feed

yi-0.4: Yi/Mode/Compilation.hs

module Yi.Mode.Compilation where

import Prelude ()
import Yi.Buffer
import Yi.Core
import Yi.Lexer.Alex (Tok(..), Posn(..))
import Yi.Prelude
import Yi.Style
import Yi.Syntax
import Yi.Dired
import Yi.Editor
import Yi.Keymap
import qualified Yi.Lexer.Alex as Alex
import qualified Yi.Lexer.Compilation         as Compilation
import qualified Yi.Syntax.Linear as Linear
import Yi.Keymap.Keys

compilationMode :: Mode (Linear.Result (Tok Compilation.Token))
compilationMode = emptyMode
  { 
   modeKeymap = (<||) (spec KEnter ?>>! withSyntax modeFollow),
   modeFollow = \synTree -> YiA (follow synTree),
   modeHL = ExtHL $ mkHighlighter (Linear.incrScanner . Alex.lexScanner Compilation.alexScanToken Compilation.initState) 
                                  (\begin end pos -> Linear.getStrokes begin end pos . fmap tokenToStroke)
  }
    where tokenToStroke (Tok t len posn) = (posnOfs posn, tokenToStyle t, posnOfs posn +~ len)
          tokenToStyle _ = commentStyle
          follow :: Linear.Result (Tok Compilation.Token) -> YiM ()
          follow errs = do 
              point <- withBuffer pointB
              case Linear.tokBefore point errs of
                 Just (Tok {tokT = Compilation.Report filename line col _message}) -> do
                     shiftOtherWindow
                     fnewE filename
                     withBuffer $ do 
                         gotoLn line
                         rightN col
                 _ -> return ()