X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.el;h=81c7b4475a0e38d2867db1ff29f6f92f0ee04fd1;hp=747f60c4dad7c0cddce7bd2ff33801eefa527e49;hb=46f41d80b023a2ebc03c678ad0e0feb5ac15b45a;hpb=9a02b950a35a159a3b86ed052c8f1a1349c7bb72 diff --git a/notmuch.el b/notmuch.el index 747f60c4..81c7b447 100644 --- a/notmuch.el +++ b/notmuch.el @@ -32,7 +32,7 @@ (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) @@ -102,9 +102,13 @@ (notmuch-show-set-tags (delete tag tags)))))) (defun notmuch-show-archive-thread () - "Archive each message currrently shown by removing the \"inbox\" tag from each. + "Archive each message in thread, and show next thread from search. -This command is safe from any race condition of new messages +Archive each message currrently shown by removing the \"inbox\" +tag from each. Then kill this buffer and show the next thread +from the search from which this thread was originally shown. + +Note: This command is safe from any race condition of new messages being delivered to the same thread. It does not archive the entire thread, but only the messages shown in the current buffer." @@ -116,7 +120,13 @@ buffer." (if (not (eobp)) (forward-char)) (if (not (re-search-forward notmuch-show-message-begin-regexp nil t)) - (goto-char (point-max)))))) + (goto-char (point-max))))) + (let ((parent-buffer notmuch-show-parent-buffer)) + (kill-this-buffer) + (if parent-buffer + (progn + (switch-to-buffer parent-buffer) + (notmuch-search-show-thread))))) (defun notmuch-show-move-to-current-message-summary-line () "Move to the beginning of the one-line summary of the current message. @@ -140,19 +150,20 @@ by searching backward)." (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. @@ -161,6 +172,28 @@ message in the buffer." (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. @@ -178,11 +211,11 @@ simply move to the beginning of the current message." )) (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. @@ -203,21 +236,15 @@ thread, (remove the \"inbox\" tag from each message). Also kill 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))) - (progn - (notmuch-show-archive-thread) - (let ((parent-buffer notmuch-show-parent-buffer)) - (kill-this-buffer) - (if parent-buffer - (progn - (switch-to-buffer parent-buffer) - (notmuch-search-show-thread))))) - (if (< (notmuch-show-find-next-message) (window-end)) - (notmuch-show-mark-read-then-next-message) - (scroll-up nil))))) + (notmuch-show-archive-thread) + (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) @@ -395,6 +422,7 @@ thread from that buffer can be show when done with this one)." (call-process "notmuch" nil t nil "show" thread-id) (notmuch-show-markup-messages) ) + (notmuch-show-next-unread-message) ))) (defvar notmuch-search-mode-map @@ -425,7 +453,7 @@ thread from that buffer can be show when done with this one)." "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 () @@ -494,7 +522,9 @@ global search. (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*"))) @@ -566,12 +596,6 @@ This function advances point to the next line when finished." (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 ()