yi-0.4.3: Yi/Modes.hs
module Yi.Modes (defaultFundamentalMode, fundamental,
latexMode, cppMode, haskellMode, literateHaskellMode, cabalMode, srmcMode, ocamlMode, defaultModeMap) where
import Control.Arrow (first)
import Prelude ()
import System.FilePath
import Yi.Buffer (AnyMode(..), Mode(..), emptyMode)
import Yi.Buffer.HighLevel (fillParagraph)
import Yi.Buffer.Indent
import Yi.Lexer.Alex (Tok(..), Posn(..))
import Yi.Mode.Haskell
import Yi.Prelude
import Yi.Style
import Yi.Syntax
import qualified Yi.Lexer.Alex as Alex
import qualified Yi.Lexer.Cabal as Cabal
import qualified Yi.Lexer.Cplusplus as Cplusplus
import qualified Yi.Lexer.Latex as Latex
import qualified Yi.Lexer.LiterateHaskell as LiterateHaskell
import qualified Yi.Lexer.OCaml as OCaml
import qualified Yi.Lexer.Srmc as Srmc
import qualified Yi.Syntax.Linear as Linear
fundamental, defaultFundamentalMode :: Mode syntax
latexMode, cppMode, literateHaskellMode, cabalMode, srmcMode, ocamlMode :: Mode (Linear.Result Stroke)
fundamental = emptyMode
{
modeIndent = \_ast -> autoIndentB,
modePrettify = \_ -> fillParagraph
}
mkHighlighter' :: forall token lexerState.
lexerState
-> (Alex.ASI lexerState
-> Maybe (Tok token, Alex.ASI lexerState))
-> (token -> Style)
-> Highlighter
(Yi.Syntax.Cache
(Alex.AlexState lexerState,
[(Point, Style, Point)])
(Linear.Result (Point, Style, Point)))
(Linear.Result (Point, Style, Point))
mkHighlighter' initSt scan tokenToStyle = mkHighlighter (Linear.incrScanner . Alex.lexScanner (fmap (first tokenToStroke) . scan) initSt) Linear.getStrokes
where tokenToStroke (Tok t len posn) = (posnOfs posn, tokenToStyle t, posnOfs posn +~ len)
cppMode = fundamental
{
modeHL = ExtHL $ mkHighlighter' Cplusplus.initState Cplusplus.alexScanToken id
}
literateHaskellMode = fundamental
{
modeHL = ExtHL $ mkHighlighter' LiterateHaskell.initState LiterateHaskell.alexScanToken id
}
cabalMode = fundamental
{
modeHL = ExtHL $ mkHighlighter' Cabal.initState Cabal.alexScanToken id
}
latexMode = fundamental
{
modeHL = ExtHL $ mkHighlighter' Latex.initState Latex.alexScanToken id
}
srmcMode = fundamental
{
modeHL = ExtHL $ mkHighlighter' Srmc.initState Srmc.alexScanToken id
}
ocamlMode = fundamental
{
modeHL = ExtHL $ mkHighlighter' OCaml.initState OCaml.alexScanToken OCaml.tokenToStyle
}
defaultFundamentalMode = fundamental
defaultModeMap :: ReaderT FilePath Maybe AnyMode
defaultModeMap = ReaderT (modeFromExtension . takeExtension)
{-
Working out the mode from the extension of
the file. Some of these are a little questionably haskell
related. For example ".x" is an alex lexer specification
I dare say that there are other file types that use ".x"
as the file extension.
For now though this is probably okay given the users of
'yi' are mostly haskell hackers, as of yet.
-}
modeFromExtension :: String -> Maybe AnyMode
modeFromExtension ".hs" = Just $ AnyMode haskellMode
modeFromExtension ".x" = Just $ AnyMode haskellMode
modeFromExtension ".lhs" = Just $ AnyMode literateHaskellMode
modeFromExtension ".hsc" = Just $ AnyMode haskellMode
modeFromExtension ".hsinc" = Just $ AnyMode haskellMode -- haskell include files such as Yi/Syntax/alex.hsinc
modeFromExtension ".cabal" = Just $ AnyMode cabalMode
modeFromExtension ".tex" = Just $ AnyMode latexMode
modeFromExtension ".sty" = Just $ AnyMode latexMode
modeFromExtension ".ltx" = Just $ AnyMode latexMode
modeFromExtension ".cxx" = Just $ AnyMode cppMode
modeFromExtension ".cpp" = Just $ AnyMode cppMode
modeFromExtension ".C" = Just $ AnyMode cppMode
modeFromExtension ".hxx" = Just $ AnyMode cppMode
modeFromExtension ".H" = Just $ AnyMode cppMode
modeFromExtension ".h" = Just $ AnyMode cppMode
modeFromExtension ".c" = Just $ AnyMode cppMode -- I treat c file as cpp files, most users are smart enough to allow for that.
modeFromExtension ".pepa" = Just $ AnyMode srmcMode -- pepa is a subset of srmc
modeFromExtension ".srmc" = Just $ AnyMode srmcMode
modeFromExtension ".ml" = Just $ AnyMode ocamlMode
modeFromExtension ".mli" = Just $ AnyMode ocamlMode
modeFromExtension ".mly" = Just $ AnyMode ocamlMode
modeFromExtension ".mll" = Just $ AnyMode ocamlMode
modeFromExtension ".ml4" = Just $ AnyMode ocamlMode
modeFromExtension ".mlp4" = Just $ AnyMode ocamlMode
modeFromExtension _ = Nothing