(define-key map "b" 'notmuch-show-toggle-body-read-visible)
(define-key map "c" 'notmuch-show-toggle-citations-visible)
(define-key map "h" 'notmuch-show-toggle-headers-visible)
- (define-key map "n" 'notmuch-show-mark-read-then-next-message)
+ (define-key map "n" 'notmuch-show-next-message)
(define-key map "p" 'notmuch-show-previous-message)
(define-key map "q" 'kill-this-buffer)
(define-key map "s" 'notmuch-show-toggle-signatures-visible)
(defun notmuch-show-next-message ()
"Advance to the beginning of the next message in the buffer.
-Moves to the beginning of the current message if already on the
-last message in the buffer."
+Moves to the end of the buffer if already on the last message in
+the buffer."
(interactive)
(notmuch-show-move-to-current-message-summary-line)
- (re-search-forward notmuch-show-message-begin-regexp nil t)
- (notmuch-show-move-to-current-message-summary-line)
+ (if (re-search-forward notmuch-show-message-begin-regexp nil t)
+ (notmuch-show-move-to-current-message-summary-line)
+ (goto-char (point-max)))
(recenter 0))
(defun notmuch-show-find-next-message ()
"Returns the position of the next message in the buffer.
-Or the beginning of the current message if already within the last
-message in the buffer."
+Or the end of the buffer if already within the last message in
+the buffer."
; save-excursion doesn't save our window position
; save-window-excursion doesn't save point
; Looks like we have to use both.
(notmuch-show-next-message)
(point))))
+(defun notmuch-show-next-unread-message ()
+ "Advance to the beginning of the next unread message in the buffer.
+
+Does nothing if there are no more unread messages past the
+current point."
+ (while (and (not (eobp))
+ (not (member "unread" (notmuch-show-get-tags))))
+ (notmuch-show-next-message)))
+
+(defun notmuch-show-find-next-unread-message ()
+ "Returns the position of the next message in the buffer.
+
+Returns the current point if there are no more unread messages
+past the current point."
+ ; save-excursion doesn't save our window position
+ ; save-window-excursion doesn't save point
+ ; Looks like we have to use both.
+ (save-excursion
+ (save-window-excursion
+ (notmuch-show-next-unread-message)
+ (point))))
+
(defun notmuch-show-previous-message ()
"Backup to the beginning of the previous message in the buffer.
))
(recenter 0)))
-(defun notmuch-show-mark-read-then-next-message ()
- "Remove unread tag from current message, then advance to next message."
+(defun notmuch-show-mark-read-then-next-unread-message ()
+ "Remove unread tag from current message, then advance to next unread message."
(interactive)
(notmuch-show-remove-tag "unread")
- (notmuch-show-next-message))
+ (notmuch-show-next-unread-message))
(defun notmuch-show-advance-marking-read-and-archiving ()
"Advance through buffer, marking read and archiving.
this buffer, and display the next thread from the search from
which this thread was originally shown."
(interactive)
- (let ((next (notmuch-show-find-next-message))
+ (let ((next (notmuch-show-find-next-unread-message))
(unread (member "unread" (notmuch-show-get-tags))))
(if (and (not unread)
(equal next (point)))
(notmuch-show-archive-thread)
- (if (< (notmuch-show-find-next-message) (window-end))
- (notmuch-show-mark-read-then-next-message)
- (scroll-up nil)))))
+ (if (and (> next (window-end))
+ (< next (point-max)))
+ (scroll-up nil)
+ (notmuch-show-mark-read-then-next-unread-message)))))
(defun notmuch-show-markup-citations-region (beg end)
(goto-char beg)
(call-process "notmuch" nil t nil "show" thread-id)
(notmuch-show-markup-messages)
)
+ (notmuch-show-next-unread-message)
)))
(defvar notmuch-search-mode-map
"Move point to the last thread in the buffer."
(interactive "^P")
(end-of-buffer arg)
- (beginning-of-line))
+ (forward-line -1))
;;;###autoload
(defun notmuch-search-mode ()
(interactive)
(let ((thread-id (notmuch-search-find-thread-id)))
(forward-line)
- (notmuch-show thread-id (current-buffer))))
+ (if (> (length thread-id) 0)
+ (notmuch-show thread-id (current-buffer))
+ (error "End of search results"))))
(defun notmuch-call-notmuch-process (&rest args)
(let ((error-buffer (get-buffer-create "*Notmuch errors*")))
(save-excursion
(call-process "notmuch" nil t nil "search" query)
(notmuch-search-markup-thread-ids)
- ; A well-behaved program ends its output with a newline, but we
- ; don't actually want the blank line at the end of the file.
- (goto-char (point-max))
- (if (looking-at "^$")
- (delete-backward-char 1)
- )
))))
(defun notmuch-search-refresh-view ()