summaryrefslogtreecommitdiffstats
path: root/Buffer/Motion.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Buffer/Motion.hs')
-rw-r--r--Buffer/Motion.hs71
1 files changed, 25 insertions, 46 deletions
diff --git a/Buffer/Motion.hs b/Buffer/Motion.hs
index 9b275d4..86446e0 100644
--- a/Buffer/Motion.hs
+++ b/Buffer/Motion.hs
@@ -15,12 +15,14 @@ data LeftRightMotion
-- | GotoFirstNonBlankChar
| GotoEndOfLine -- XXX in Vi this can go downwards
| GotoColumn Int
- | GotoFindLeft Int Char
- | GotoFindRight Int Char
- | GotillFindLeft Int Char
- | GotillFindRight Int Char
+ -- | GotoFindLeft Int (Char -> Bool) -- TODO don't use functions here
+ -- | GotoFindRight Int (Char -> Bool) -- TODO ^ dto.
+ -- | GotillFindLeft Int Char
+ -- | GotillFindRight Int Char
-- | RepeatLastFind Int
-- | RepeatLastFindReverse Int
+ | WordsForward Int
+ | WordsBackward Int
deriving (Show)
-- TODO fail if cannot splitAt properly OR if we didn't modify the buffer
@@ -38,44 +40,23 @@ gotoEndOfLine (ls, rs) = (ls ++ rs, "")
-- TODO fail if i <= 0 or i > length
gotoColumn i (ls, rs) = splitAt (i - 1) $ ls ++ rs
--- TODO is this definition correct?
-spanEnd :: (a -> Bool) -> [a] -> ([a], [a])
-spanEnd p xs = let ls = dropWhileEnd p xs in (ls, drop (length ls) xs)
-
--- TODO don't allow i == 0 in go{to,till}Find{Left,Right}
-
-gotoFindLeft i c b@(ls, rs)
- | i == 0 = b
- | i > 0 =
- let (lls, rls) = spanEnd (/= c) ls
- in gotoFindLeft (i - 1) c (init lls, last lls : rls ++ rs)
-
-gotoFindRight i c b@(ls, rs)
- | i == 0 = b
- | i > 0 =
- let (lrs, rrs) = span (/= c) rs
- in gotoFindRight (i - 1) c (ls ++ lrs ++ [head rrs], tail rrs)
-
--- TODO this has to fail it there aren't enought c's
-gotillFindLeft i c b@(ls, rs) =
- let (lls, rls) = spanEnd (/= c) ls
- in
- if i > 1
- then gotillFindLeft (i - 1) c (init lls, last lls : rls ++ rs)
- else (lls, rls ++ rs)
-
---gotillFindRight i c b@(ls, rs)
--- | i == 0 = b
--- | i > 0 =
--- let (lrs, rrs) = span (/= c) rs
--- in gotoFindRight (i - 1) c (ls ++ lrs, rrs)
-
-gotillFindRight i c b@(ls, rs) =
- let (lrs, rrs) = span (/= c) rs
- in
- if i > 1
- then gotillFindRight (i - 1) c (ls ++ lrs ++ [head rrs], tail rrs)
- else (ls ++ lrs, rrs)
+wordsForward i (ls, rs) =
+ let rs' = dropWhile (==' ') $ dropWhile (/=' ') rs
+ ls' = ls ++ take (length rs - length rs') rs
+ b' = (ls', rs')
+ in
+ if i > 1
+ then wordsForward (i - 1) b'
+ else b'
+
+wordsBackward i (ls, rs) =
+ let ls' = dropWhileEnd (/=' ') $ dropWhileEnd (==' ') ls
+ rs' = drop (length ls') ls ++ rs
+ b' = (ls', rs')
+ in
+ if i > 1
+ then wordsBackward (i - 1) b'
+ else b'
move :: LeftRightMotion -> Buffer -> Buffer
@@ -84,7 +65,5 @@ move (GotoRight i) = gotoRight i
move GotoFirstChar = gotoFirstChar
move GotoEndOfLine = gotoEndOfLine
move (GotoColumn i) = gotoColumn i
-move (GotoFindLeft i c) = gotoFindLeft i c
-move (GotoFindRight i c) = gotoFindRight i c
-move (GotillFindLeft i c) = gotillFindLeft i c
-move (GotillFindRight i c) = gotillFindRight i c
+move (WordsForward i) = wordsForward i
+move (WordsBackward i) = wordsBackward i