summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Buffer/Motion.hs27
-rw-r--r--src/Main.hs57
2 files changed, 44 insertions, 40 deletions
diff --git a/src/Buffer/Motion.hs b/src/Buffer/Motion.hs
index 1333b78..8e59789 100644
--- a/src/Buffer/Motion.hs
+++ b/src/Buffer/Motion.hs
@@ -3,18 +3,15 @@ module Buffer.Motion where
import Data.List (dropWhileEnd)
import Buffer.Class
---data Motion = Motion Int LeftRightMotion
-
-
-- TODO factor Count
-- TODO various Vim gX
-data LeftRightMotion
- = GotoLeft
- | GotoRight
- | GotoFirstChar
+data Motion
+ = CharsBackward
+ | CharsForward
+ | ToStartOfLine
-- | GotoFirstNonBlankChar
- | GotoEndOfLine -- XXX in Vi this can go downwards
- | GotoColumn
+ | ToEndOfLine -- XXX in Vi this can go downwards
+ | ToColumn
-- | GotoFindLeft (Char -> Bool) -- TODO don't use functions here
-- | GotoFindRight (Char -> Bool) -- TODO ^ dto.
-- | GotillFindLeft Char
@@ -73,11 +70,11 @@ wordsBackward i (ls, rs) =
else b'
-move :: LeftRightMotion -> Int -> Buffer -> Buffer
-move GotoLeft c = gotoLeft c
-move GotoRight c = gotoRight c
-move GotoFirstChar _ = gotoFirstChar -- TODO use count
-move GotoEndOfLine _ = gotoEndOfLine -- TODO use count
-move GotoColumn c = gotoColumn c
+move :: Motion -> Int -> Buffer -> Buffer
+move CharsBackward c = gotoLeft c
+move CharsForward c = gotoRight c
+move ToStartOfLine _ = gotoFirstChar -- TODO use count
+move ToEndOfLine _ = gotoEndOfLine -- TODO use count
+move ToColumn c = gotoColumn c
move WordsForward c = wordsForward c
move WordsBackward c = wordsBackward c
diff --git a/src/Main.hs b/src/Main.hs
index f14d405..da1141d 100644
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -157,8 +157,8 @@ data Command
| KillLastChar
| KillNextChar
| ExecuteInputBuffer
- | MotionCommand LeftRightMotion
- | MotionCommandWarn LeftRightMotion
+ | MoveCursor Motion
+ | MoveCursorWarn Motion
| ChangeMode Mode
-- TODO Move Count Motion
-- Delete Count Register Motion
@@ -233,7 +233,7 @@ execCommand :: Command -> VT ()
execCommand DebugShowVTState =
get >>= tell . (:[]) . pp . SGR [35] . Plain . show
-execCommand (MotionCommand x) = do
+execCommand (MoveCursor x) = do
c <- uses count (maybe 1 id)
buffer %= move x c
@@ -246,9 +246,9 @@ execCommand (MotionCommand x) = do
-- failed moves. Currently this is only used to SetCount Nothing (which
-- is defunct atm) Alternatively we could simply reset the state when an
-- error happens Discus!
-execCommand (MotionCommandWarn x) = do
+execCommand (MoveCursorWarn x) = do
b0 <- use buffer
- execCommand (MotionCommand x)
+ execCommand (MoveCursor x)
b1 <- use buffer
-- TODO make this a warning or else ...
@@ -511,27 +511,34 @@ selectRegisterMap =
(['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ ".%#:-\""))
+-- TODO maybe in normal mode reset count (SetCount Nothing) after each
+-- command doesn't alter the count. How would this work together with
+-- ChangeMode DeleteMode
+-- TODO 2017-08-06
+-- initialize count whenever nmap is entered
+-- ditch SetCount Nothing
+-- pass count to commands / modes
nmap :: Keymap
nmap =
[ ("\ESC", SetCount Nothing)
-- ^TODO RingBell if count is already Nothing
-- TODO cancel any unfinished commands
, ("i", ChangeMode InsertMode <> SetCount Nothing)
- , ("a", ChangeMode InsertMode <> SetCount Nothing <> MotionCommand GotoRight)
- , ("I", ChangeMode InsertMode <> MotionCommand GotoFirstChar)
- , ("A", ChangeMode InsertMode <> MotionCommand GotoEndOfLine)
- , ("|", MotionCommandWarn GotoColumn <> SetCount Nothing)
- , ("$", MotionCommandWarn GotoEndOfLine <> SetCount Nothing)
- , ("h", MotionCommandWarn GotoLeft <> SetCount Nothing)
- , ("l", MotionCommandWarn GotoRight <> SetCount Nothing)
- , ("b", MotionCommandWarn WordsBackward <> SetCount Nothing)
- , ("w", MotionCommandWarn WordsForward <> SetCount Nothing)
+ , ("a", ChangeMode InsertMode <> SetCount Nothing <> MoveCursor CharsForward)
+ , ("I", ChangeMode InsertMode <> MoveCursor ToStartOfLine)
+ , ("A", ChangeMode InsertMode <> MoveCursor ToEndOfLine)
+ , ("|", MoveCursorWarn ToColumn <> SetCount Nothing)
+ , ("$", MoveCursorWarn ToEndOfLine <> SetCount Nothing)
+ , ("h", MoveCursorWarn CharsBackward <> SetCount Nothing)
+ , ("l", MoveCursorWarn CharsForward <> SetCount Nothing)
+ , ("b", MoveCursorWarn WordsBackward <> SetCount Nothing)
+ , ("w", MoveCursorWarn WordsForward <> SetCount Nothing)
, ("d", ChangeMode DeleteMode)
, ("\"", ChangeMode SelectRegisterMode <> SetCount Nothing)
, ("\ESC[24~", DebugShowVTState)
- , ("\ESC[C", MotionCommandWarn GotoRight <> SetCount Nothing)
- , ("\ESC[D", MotionCommandWarn GotoLeft <> SetCount Nothing)
- , ("\x0a", ExecuteInputBuffer <> ChangeMode InsertMode <> SetCount Nothing)
+ , ("\ESC[C", MoveCursorWarn CharsForward <> SetCount Nothing)
+ , ("\ESC[D", MoveCursorWarn CharsBackward <> SetCount Nothing)
+ , ("\n", ExecuteInputBuffer <> ChangeMode InsertMode <> SetCount Nothing)
]
++ (map (\i -> (show i, AppendCount i)) [0..9])
-- XXX
@@ -542,7 +549,7 @@ nmap =
-- x = Embed f
-- f :: VT Command
-- f = gets (isJust . count) >>=
- -- return . bool (MotionCommand GotoFirstChar) (AppendCount 0)
+ -- return . bool (MoveCursor ToStartOfLine) (AppendCount 0)
-- bool :: a -> a -> Bool -> a
-- bool _ a True = a
-- bool a _ False = a
@@ -555,20 +562,20 @@ nmap =
imap :: Keymap
imap =
- [ ("\ESC", ChangeMode NormalMode <> MotionCommand GotoLeft)
- , ("\x01", MotionCommandWarn GotoFirstChar)
- , ("\x05", MotionCommandWarn GotoEndOfLine)
+ [ ("\ESC", ChangeMode NormalMode <> MoveCursor CharsBackward)
+ , ("\x01", MoveCursorWarn ToStartOfLine)
+ , ("\x05", MoveCursorWarn ToEndOfLine)
, ("\ESC[24~", DebugShowVTState)
, ("\ESC[3~", KillNextChar)
- , ("\ESC[C", MotionCommandWarn GotoRight)
- , ("\ESC[D", MotionCommandWarn GotoLeft)
+ , ("\ESC[C", MoveCursorWarn CharsForward)
+ , ("\ESC[D", MoveCursorWarn CharsBackward)
, ("\x16", ChangeMode VerbatimMode) -- ^V
, ("\x17", KillLastWord) -- ^W
, ("\x0a", ExecuteInputBuffer)
, ("\x7f", KillLastChar) -- Delete
, ("\x08", KillLastChar) -- BackSpace
- , ("\ESCOc", MotionCommandWarn WordsForward)
- , ("\ESCOd", MotionCommandWarn WordsBackward)
+ , ("\ESCOc", MoveCursorWarn WordsForward)
+ , ("\ESCOd", MoveCursorWarn WordsBackward)
]