emacs/show: provide notmuch-show-choose-duplicate

This new command allows the user to interactively choose a different
duplicate (file) to display for a given message in
notmuch-show-mode. Since both tree and unthreaded view use
notmuch-show-mode, this provides the same facility there.
This commit is contained in:
David Bremner 2022-07-01 18:45:45 -03:00
parent 4612f3eb3d
commit b3d466bf39
6 changed files with 87 additions and 1 deletions

View file

@ -40,6 +40,7 @@
| Z | notmuch-tree-from-search-current-query | notmuch-tree-from-show-current-query | |
| =!= | | notmuch-show-toggle-elide-non-matching | |
| =#= | | notmuch-show-print-message | |
| =%= | | notmuch-show-replace-msg | |
| =$= | | notmuch-show-toggle-process-crypto | |
| =*= | notmuch-search-tag-all | notmuch-show-tag-all | notmuch-tree-tag-thread |
| + | notmuch-search-add-tag | notmuch-show-add-tag | notmuch-tree-add-tag |

View file

@ -1029,7 +1029,7 @@ status."
(defvar-local notmuch-show-process-crypto nil)
(defun notmuch--run-show (search-terms)
(defun notmuch--run-show (search-terms &optional duplicate)
"Return a list of threads of messages matching SEARCH-TERMS.
A thread is a forest or list of trees. A tree is a two element
@ -1038,6 +1038,8 @@ is a possibly empty forest of replies."
(let ((args '("show" "--format=sexp" "--format-version=5")))
(when notmuch-show-process-crypto
(setq args (append args '("--decrypt=true"))))
(when duplicate
(setq args (append args (list (format "--duplicate=%d" duplicate)))))
(setq args (append args search-terms))
(apply #'notmuch-call-notmuch-sexp args)))

View file

@ -1127,6 +1127,30 @@ is t, hide the part initially and show the button."
(defvar notmuch-show-previous-subject "")
(make-variable-buffer-local 'notmuch-show-previous-subject)
(defun notmuch-show-choose-duplicate (duplicate)
(interactive "Nduplicate: ")
(let ((count (length (notmuch-show-get-prop :filename))))
(when (or (> duplicate count)
(< duplicate 1))
(error "Duplicate %d out of range [1,%d]" duplicate count)))
(notmuch-show-move-to-message-top)
(save-excursion
(let* ((extent (notmuch-show-message-extent))
(id (notmuch-show-get-message-id))
(depth (notmuch-show-get-depth))
(inhibit-read-only t)
(new-msg (notmuch--run-show (list id) duplicate)))
;; clean up existing overlays to avoid extending them.
(dolist (o (overlays-in (car extent) (cdr extent)))
(delete-overlay o))
;; pretend insertion is happening at end of buffer
(narrow-to-region (point-min) (car extent))
;; Insert first, then delete, to avoid marker for start of next
;; message being in same place as the start of this one.
(notmuch-show-insert-msg new-msg depth)
(widen)
(delete-region (point) (cdr extent)))))
(defun notmuch-show-insert-msg (msg depth)
"Insert the message MSG at depth DEPTH in the current thread."
(let* ((headers (plist-get msg :headers))
@ -1583,6 +1607,7 @@ reset based on the original query."
(define-key map "#" 'notmuch-show-print-message)
(define-key map "!" 'notmuch-show-toggle-elide-non-matching)
(define-key map "$" 'notmuch-show-toggle-process-crypto)
(define-key map "%" 'notmuch-show-choose-duplicate)
(define-key map "<" 'notmuch-show-toggle-thread-indentation)
(define-key map "t" 'toggle-truncate-lines)
(define-key map "." 'notmuch-show-part-map)

View file

@ -338,4 +338,33 @@ when we detect the word "attachment" and there's no attach? :p
EOF
test_expect_equal_file EXPECTED OUTPUT
add_email_corpus duplicate
ID3=87r2ecrr6x.fsf@zephyr.silentflame.com
test_begin_subtest "duplicate=3"
test_emacs "(notmuch-show \"id:${ID3}\")
(notmuch-show-choose-duplicate 3)
(test-visible-output \"OUTPUT\")"
output=$(grep "Subject:" OUTPUT)
file=$(notmuch search --output=files id:${ID3} | head -n 3 | tail -n 1)
subject=$(grep '^Subject:' $file)
test_expect_equal "$output" "$subject"
test_begin_subtest "duplicate=0"
test_emacs "(test-log-error
(notmuch-show \"id:${ID3}\")
(notmuch-show-choose-duplicate 0))"
cat <<EOF > EXPECTED
(error Duplicate 0 out of range [1,5])
EOF
test_expect_equal_file EXPECTED MESSAGES
test_begin_subtest "duplicate=1000"
test_emacs "(test-log-error
(notmuch-show \"id:${ID3}\")
(notmuch-show-choose-duplicate 1000))"
cat <<EOF > EXPECTED
(error Duplicate 1000 out of range [1,5])
EOF
test_expect_equal_file EXPECTED MESSAGES
test_done

View file

@ -200,4 +200,18 @@ test_emacs '(test-log-error
(notmuch-tree "*")))'
test_expect_equal "$(cat MESSAGES)" "COMPLETE"
add_email_corpus duplicate
ID3=87r2ecrr6x.fsf@zephyr.silentflame.com
test_begin_subtest "duplicate=3"
test_emacs "(notmuch-tree \"id:${ID3}\")
(notmuch-test-wait)
(notmuch-tree-show-message t)
(notmuch-show-choose-duplicate 3)
(test-visible-output \"OUTPUT\")"
output=$(grep "Subject:" OUTPUT)
file=$(notmuch search --output=files id:${ID3} | head -n 3 | tail -n 1)
subject=$(grep '^Subject:' $file)
test_expect_equal "$output" "$subject"
test_done

View file

@ -57,4 +57,19 @@ test_emacs '(test-log-error
(notmuch-unthreaded "*")))'
test_expect_equal "$(cat MESSAGES)" "COMPLETE"
add_email_corpus duplicate
ID3=87r2ecrr6x.fsf@zephyr.silentflame.com
test_begin_subtest "duplicate=3"
test_emacs "(let ((notmuch-tree-show-out t))
(notmuch-unthreaded \"id:${ID3}\")
(notmuch-test-wait)
(notmuch-tree-show-message nil)
(notmuch-show-choose-duplicate 3)
(test-visible-output \"OUTPUT\"))"
output=$(grep "Subject:" OUTPUT)
file=$(notmuch search --output=files id:${ID3} | head -n 3 | tail -n 1)
subject=$(grep '^Subject:' $file)
test_expect_equal "$output" "$subject"
test_done