diff options
| author | tv <tv@shackspace.de> | 2014-07-27 18:55:32 +0200 | 
|---|---|---|
| committer | tv <tv@shackspace.de> | 2014-07-27 18:55:32 +0200 | 
| commit | 4589d9cf494d9cca19aa4da8aa754f6b31ef1876 (patch) | |
| tree | 80dbb4a6f68513ba73bafb0fbfe37d74d21c2482 | |
| parent | a6b938977705042b5ca0ca9c3272f76f229f1a42 (diff) | |
s/Go{to,till}Find{Left,Right}/{For,Back}wardWord/
| -rw-r--r-- | Buffer/Motion.hs | 71 | ||||
| -rw-r--r-- | Main.hs | 4 | 
2 files changed, 27 insertions, 48 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 @@ -316,8 +316,8 @@ nmap =    -- OR    --    [MotionCommand SkipSpaceRight, MotionCommand $ GotillFindRight 1 ' ']    --    etc. -  , ("\x1bOc", MotionCommand $ GotillFindRight 1 ' ') -  , ("\x1bOd", MotionCommand $ GotillFindLeft 1 ' ') +  , ("\x1bOc", MotionCommand $ WordsForward 1) +  , ("\x1bOd", MotionCommand $ WordsBackward 1)    ]    ++ [unboundSequence "\x1b[2~" "<Insert>"]    ++ [unboundSequence "\x1b[5~" "<Prior>"]    -- page up | 
