1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
{-# LANGUAGE CPP #-}
import Control.Monad.State.Lazy (execStateT)
import Data.List (intersperse)
import Lens.Micro.Platform ((.=))
import Data.Maybe (fromMaybe)
import Data.Monoid ((<>))
import Data.Version (showVersion)
import Paths_yi_core (version)
import Options.Applicative
import Yi hiding (option)
import Yi.Config.Simple.Types
import Yi.Buffer.Misc (lineMoveRel)
import Yi.Config.Default.HaskellMode (configureHaskellMode)
import Yi.Config.Default.JavaScriptMode (configureJavaScriptMode)
import Yi.Config.Default.MiscModes (configureMiscModes)
#ifdef VIM
import Yi.Config.Default.Vim (configureVim)
#endif
#ifdef VTY
import Yi.Config.Default.Vty (configureVty)
#endif
#ifdef EMACS
import Yi.Config.Default.Emacs (configureEmacs)
#endif
#ifdef PANGO
import Yi.Config.Default.Pango (configurePango)
#endif
frontends :: [(String, ConfigM ())]
frontends = [
#ifdef PANGO
("pango", configurePango),
#endif
#ifdef VTY
("vty", configureVty),
#endif
("", return ())
]
keymaps :: [(String, ConfigM ())]
keymaps = [
#ifdef EMACS
("emacs", configureEmacs),
#endif
#ifdef VIM
("vim", configureVim),
#endif
("", return ())
]
data CommandLineOptions = CommandLineOptions {
frontend :: Maybe String
, keymap :: Maybe String
, startOnLine :: Maybe Int
, files :: [String]
}
commandLineOptions :: Parser (Maybe CommandLineOptions)
commandLineOptions = flag' Nothing
( long "version"
<> short 'v'
<> help "Show the version number")
<|> (Just <$> (CommandLineOptions
<$> optional (strOption
( long "frontend"
<> short 'f'
<> metavar "FRONTEND"
<> help "The frontend to use (default is pango)"))
<*> optional (strOption
( long "keymap"
<> short 'k'
<> metavar "KEYMAP"
<> help "The keymap to use (default is emacs)"))
<*> optional (option auto
( long "line"
<> short 'l'
<> metavar "NUM"
<> help "Open the (last) file on line NUM"))
<*> many (argument str (metavar "FILES..."))
))
main :: IO ()
main = do
mayClo <- execParser opts
case mayClo of
Nothing -> putStrLn $ "Yi " <> showVersion version
Just clo -> do
let openFileActions = intersperse (EditorA newTabE) (map (YiA . openNewFile) (files clo))
moveLineAction = YiA $ withCurrentBuffer (lineMoveRel (fromMaybe 0 (startOnLine clo)))
cfg <- execStateT
(runConfigM (myConfig (frontend clo) (keymap clo) >> (startActionsA .= (openFileActions ++ [moveLineAction]))))
defaultConfig
startEditor cfg Nothing
where
opts = info (helper <*> commandLineOptions)
( fullDesc
<> progDesc "Edit files"
<> header "Yi - a flexible and extensible text editor written in haskell")
myConfig :: Maybe String -> Maybe String -> ConfigM ()
myConfig f k = do
-- Lookup f in the frontends list or pick the first element of the frontends list if
-- f is nothing or do nothing if f is not found in the frontends list.
case f of
Nothing -> snd (head frontends)
Just f' -> fromMaybe (return ()) (lookup f' frontends)
-- Same as above, but then with k and keymaps
case k of
Nothing -> snd (head keymaps)
Just k' -> fromMaybe (return ()) (lookup k' keymaps)
configureHaskellMode
configureJavaScriptMode
configureMiscModes
|