From 3c70b1c4a5dd2e66280bc234d5d4e626ded4cc33 Mon Sep 17 00:00:00 2001 From: tv Date: Wed, 31 Dec 2014 13:18:42 +0100 Subject: \t moves cursor to next unread message --- test5.hs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'test5.hs') diff --git a/test5.hs b/test5.hs index c6142c4..3b7c909 100644 --- a/test5.hs +++ b/test5.hs @@ -232,6 +232,8 @@ keymap "\ESC[d" = moveTreeRight 1 -- S-Left keymap "\ESC[5~" = \q -> moveTreeDown (screenHeight q `div` 2) q -- PgUp keymap "\ESC[6~" = \q -> moveTreeUp (screenHeight q `div` 2) q -- PgDn keymap "\n" = toggleFold +keymap "\ESC[Z" = moveCursorUpToPrevUnreadMessage -- S-Tab +keymap "\t" = moveCursorDownToNextUnreadMessage keymap "\DEL" = moveToParent -- backspace -- TODO Stuff Vim sends after exit (also there is more...) @@ -336,6 +338,42 @@ moveToParent q@State{..} = i -> moveTreeDown i q' +moveCursorToUnreadMessage + :: (Num a, Monad m, Eq a) + => (Z.TreePos Z.Full TreeView -> Maybe (Z.TreePos Z.Full TreeView)) + -> (State -> a) + -> (a -> State -> m State) + -> State -> m State +moveCursorToUnreadMessage cursorMove getTreeMoveCount treeMove q@State{..} = + case cursorMove cursor >>= rec of + Just cursor' -> + let q' = q { cursor = cursor' } + in case getTreeMoveCount q' of + 0 -> return q' + i -> treeMove i q' + Nothing -> + return q { flashMessage = "no unread message in sight" } + where + rec loc = + if isUnreadMessage loc + then Just loc + else cursorMove loc >>= rec + isUnreadMessage loc = + case Z.label loc of + TVMessage m -> + "unread" `elem` Notmuch.messageTags m + _ -> + False + +moveCursorUpToPrevUnreadMessage :: Monad m => State -> m State +moveCursorUpToPrevUnreadMessage = + moveCursorToUnreadMessage findPrev topOverrun moveTreeDown + +moveCursorDownToNextUnreadMessage :: Monad m => State -> m State +moveCursorDownToNextUnreadMessage = + moveCursorToUnreadMessage findNext botOverrun moveTreeUp + + toggleFold :: State -> IO State toggleFold q@State{..} = case Z.label cursor of TVMessage _ -> do -- cgit v1.2.3