mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
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:
parent
4612f3eb3d
commit
b3d466bf39
6 changed files with 87 additions and 1 deletions
|
@ -40,6 +40,7 @@
|
||||||
| Z | notmuch-tree-from-search-current-query | notmuch-tree-from-show-current-query | |
|
| Z | notmuch-tree-from-search-current-query | notmuch-tree-from-show-current-query | |
|
||||||
| =!= | | notmuch-show-toggle-elide-non-matching | |
|
| =!= | | notmuch-show-toggle-elide-non-matching | |
|
||||||
| =#= | | notmuch-show-print-message | |
|
| =#= | | notmuch-show-print-message | |
|
||||||
|
| =%= | | notmuch-show-replace-msg | |
|
||||||
| =$= | | notmuch-show-toggle-process-crypto | |
|
| =$= | | notmuch-show-toggle-process-crypto | |
|
||||||
| =*= | notmuch-search-tag-all | notmuch-show-tag-all | notmuch-tree-tag-thread |
|
| =*= | notmuch-search-tag-all | notmuch-show-tag-all | notmuch-tree-tag-thread |
|
||||||
| + | notmuch-search-add-tag | notmuch-show-add-tag | notmuch-tree-add-tag |
|
| + | notmuch-search-add-tag | notmuch-show-add-tag | notmuch-tree-add-tag |
|
||||||
|
|
|
@ -1029,7 +1029,7 @@ status."
|
||||||
|
|
||||||
(defvar-local notmuch-show-process-crypto nil)
|
(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.
|
"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
|
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")))
|
(let ((args '("show" "--format=sexp" "--format-version=5")))
|
||||||
(when notmuch-show-process-crypto
|
(when notmuch-show-process-crypto
|
||||||
(setq args (append args '("--decrypt=true"))))
|
(setq args (append args '("--decrypt=true"))))
|
||||||
|
(when duplicate
|
||||||
|
(setq args (append args (list (format "--duplicate=%d" duplicate)))))
|
||||||
(setq args (append args search-terms))
|
(setq args (append args search-terms))
|
||||||
(apply #'notmuch-call-notmuch-sexp args)))
|
(apply #'notmuch-call-notmuch-sexp args)))
|
||||||
|
|
||||||
|
|
|
@ -1127,6 +1127,30 @@ is t, hide the part initially and show the button."
|
||||||
(defvar notmuch-show-previous-subject "")
|
(defvar notmuch-show-previous-subject "")
|
||||||
(make-variable-buffer-local '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)
|
(defun notmuch-show-insert-msg (msg depth)
|
||||||
"Insert the message MSG at depth DEPTH in the current thread."
|
"Insert the message MSG at depth DEPTH in the current thread."
|
||||||
(let* ((headers (plist-get msg :headers))
|
(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-print-message)
|
||||||
(define-key map "!" 'notmuch-show-toggle-elide-non-matching)
|
(define-key map "!" 'notmuch-show-toggle-elide-non-matching)
|
||||||
(define-key map "$" 'notmuch-show-toggle-process-crypto)
|
(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 "<" 'notmuch-show-toggle-thread-indentation)
|
||||||
(define-key map "t" 'toggle-truncate-lines)
|
(define-key map "t" 'toggle-truncate-lines)
|
||||||
(define-key map "." 'notmuch-show-part-map)
|
(define-key map "." 'notmuch-show-part-map)
|
||||||
|
|
|
@ -338,4 +338,33 @@ when we detect the word "attachment" and there's no attach? :p
|
||||||
EOF
|
EOF
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
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
|
test_done
|
||||||
|
|
|
@ -200,4 +200,18 @@ test_emacs '(test-log-error
|
||||||
(notmuch-tree "*")))'
|
(notmuch-tree "*")))'
|
||||||
test_expect_equal "$(cat MESSAGES)" "COMPLETE"
|
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
|
test_done
|
||||||
|
|
|
@ -57,4 +57,19 @@ test_emacs '(test-log-error
|
||||||
(notmuch-unthreaded "*")))'
|
(notmuch-unthreaded "*")))'
|
||||||
test_expect_equal "$(cat MESSAGES)" "COMPLETE"
|
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
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue