diff options
author | tv <tv@shackspace.de> | 2014-07-27 19:30:36 +0200 |
---|---|---|
committer | tv <tv@shackspace.de> | 2014-07-27 19:30:36 +0200 |
commit | beac392d39f7a94e8a1f0be366e4c2bf58852e8d (patch) | |
tree | c83278da40675d46c613218da67d0fc2f38203b5 | |
parent | 6408e2fabcd251861124045f37a040cc7d4ac465 (diff) |
modal editing begins
-rw-r--r-- | Main.hs | 37 |
1 files changed, 26 insertions, 11 deletions
@@ -27,7 +27,7 @@ data VTState = VTState , mode :: Mode } -emptyState = VTState emptyBuffer (NormalMode nmap) +emptyState = VTState emptyBuffer InsertMode @@ -47,7 +47,7 @@ main = do hFlush stdout forkIO $ (dateThread 1000000) lock - uiThread (NormalMode nmap) lock + uiThread InsertMode lock dateThread delay lock = forever $ do @@ -107,6 +107,7 @@ data Command | ExecuteInputBuffer | UnboundSequence String String | MotionCommand LeftRightMotion + | ChangeMode Mode -- TODO Move Count Motion -- Delete Count Register Motion -- etc. @@ -185,6 +186,9 @@ execCommand (MotionCommand x) = execCommand (InsertChar c) = modifyBuffer (insertChar c) +execCommand (ChangeMode m) = + modify $ \ q -> q { mode = m } + execCommand (InsertCharThenChangeMode c m) = modify $ \ q -> q { mode = m @@ -290,10 +294,16 @@ charToCode c = "\\x" ++ showIntAtBase 16 intToDigit (ord c) "" +nmap = + [ ("i", ChangeMode InsertMode) + , ("0", MotionCommand GotoFirstChar) + , ("$", MotionCommand GotoEndOfLine) + ] -nmap = - [ ("\x01", MotionCommand GotoFirstChar) +imap = + [ ("\x1b", ChangeMode NormalMode) + , ("\x01", MotionCommand GotoFirstChar) , ("\x05", MotionCommand GotoEndOfLine) , ("\x1b[3~", KillNextChar) , ("\x1b[C", MotionCommand $ GotoRight 1) @@ -376,28 +386,33 @@ unboundSequence seq name = (seq, UnboundSequence seq name) +type Keymap = [(String, Command)] + data Mode - = NormalMode [(String, Command)] + = InsertMode + | NormalMode | VerbatimMode instance Show Mode where - show (NormalMode _) = "normal" + show NormalMode = "normal" + show InsertMode = "insert" show VerbatimMode = "verbatim" getCommand :: Mode -> IO Command -getCommand (NormalMode map) = getMappedCommand map +getCommand InsertMode = getMappedCommand imap InsertChar +getCommand NormalMode = getMappedCommand nmap (AlertBadInput . (:[])) getCommand VerbatimMode = verbatimKeymap -getMappedCommand :: [(String, Command)] -> IO Command -getMappedCommand xs = do +getMappedCommand :: Keymap -> (Char -> Command) -> IO Command +getMappedCommand xs defCmd = do c <- getChar if any (isPrefixOf [c] . fst) xs then rec [c] else if isPrint c - then return $ InsertChar c + then return $ defCmd c else return $ AlertBadInput [c] where rec :: String -> IO Command @@ -417,7 +432,7 @@ verbatimKeymap :: IO Command verbatimKeymap = do c <- getChar --return $ InsertCharThenChangeMode c defaultGetCommand - return $ InsertCharThenChangeMode c (NormalMode nmap) + return $ InsertCharThenChangeMode c NormalMode -- TODO Control.Monad.whenLeft |