yi-contrib-0.10.0: src/Yi/Config/Users/Reiner.hs
{-# LANGUAGE DoAndIfThenElse #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HADDOCK show-extensions #-}
-- |
-- Module : Yi.Config.Users.Reiner
-- License : GPL-2
-- Maintainer : yi-devel@googlegroups.com
-- Stability : experimental
-- Portability : portable
module Yi.Config.Users.Reiner (setup, main) where
import Control.Lens
import Data.Monoid
import qualified Data.Text as T
import System.Directory
import System.FilePath
import Yi.Command(buildRun)
import Yi.Config.Simple
import qualified Yi.Mode.Haskell as Haskell
import Yi.Mode.Latex(latexMode3)
import Yi.Monad
import qualified Yi.Rope as R
import Yi.Utils
-- | The main entry point, when used as a standalone yi.hs file.
main :: IO ()
main = configMain defaultEmacsConfig setup
-- | Registers my settings in the 'ConfigM' monad.
setup :: ConfigM ()
setup = do
setFrontendPreferences ["pango", "vte", "vty"]
fontSize .= Just 9
globalBindKeys globalBindings
evaluator .= publishedActionsEvaluator
publishAction "createDirectory" yiCreateDirectory
addMode Haskell.fastMode
modeBindKeys Haskell.fastMode
(ctrlCh 'c' ?>> ctrlCh 's' ?>>! insertHaskSection)
-- LaTeX stuff
addMode latexMode3
publishAction "compileLatex" compileLatex
modeBindKeys latexMode3 (ctrlCh 'c' ?>> ctrlCh 'c' ?>>! compileLatex)
--------------------------------------------------------------------------------
-- Actions and bindings --
--------------------------------------------------------------------------------
yiCreateDirectory :: YiM ()
yiCreateDirectory = do
BufferFileInfo{bufInfoFileName} <- withEditor $ withCurrentBuffer bufInfoB
let dir = takeDirectory bufInfoFileName
exists <- io $ doesDirectoryExist dir
if not exists
then do io $ createDirectoryIfMissing True dir
withEditor $ printMsg $ "Created directory '" <> T.pack dir <> "'."
else withEditor $ printMsg $ "Directory already exists!"
sectionSize :: Int
sectionSize = 80
-- inserts the "Actions and bindings" header above
insertHaskSection :: R.YiString -> BufferM ()
insertHaskSection s
| lenS >= sectionSize - 6 = do
insertDashes lenS
newlineB
insertN s
newlineB
insertDashes lenS
| otherwise = do
insertDashes sectionSize
newlineB
insertN "--"
let nSpaces = sectionSize - 4 - lenS
nSpacesL = nSpaces `div` 2
nSpacesR = nSpaces - nSpacesL
insertN $ repChar nSpacesL ' '
insertN s
insertN $ repChar nSpacesR ' '
insertN "--"
newlineB
insertDashes sectionSize
where lenS = R.length s
insertDashes n = insertN $ repChar n '-'
repChar n c = R.fromText . T.replicate n $ T.singleton c
globalBindings :: I Event Yi.Config.Simple.Action ()
globalBindings = choice
[ ctrlCh '\t' ?>>! nextWinE
, shift (ctrlCh '\t') ?>>! prevWinE
, metaCh 'r' ?>>! reload
]
compileLatex :: YiM ()
compileLatex = do
withEditor (withCurrentBuffer $ gets file) >>= \case
Just filename -> buildRun "pdflatex" ["--file-line-error"
, "--interaction=nonstopmode"
, T.pack filename
] (const $ return ())
Nothing -> return ()