mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-04 16:38:14 +01:00
emacs: add notmuch-tag-undo
Keybindings are deferred to a future commit.
This commit is contained in:
parent
9b2a548189
commit
cc2c3a383d
3 changed files with 79 additions and 0 deletions
|
@ -383,6 +383,21 @@ operations specified in ``notmuch-tagging-keys``; i.e. each
|
||||||
|
|
||||||
|docstring::notmuch-tagging-keys|
|
|docstring::notmuch-tagging-keys|
|
||||||
|
|
||||||
|
.. _notmuch-tag-undo:
|
||||||
|
|
||||||
|
notmuch-tag-undo
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Each notmuch buffer supporting tagging operations (i.e buffers in
|
||||||
|
:any:`notmuch-show`, :any:`notmuch-search`, :any:`notmuch-tree`, and
|
||||||
|
:any:`notmuch-unthreaded` mode) keeps a local stack of tagging
|
||||||
|
operations. These can be undone via ``notmuch-tag-undo``. By default
|
||||||
|
this is bound to the usual Emacs keys for undo.
|
||||||
|
|
||||||
|
:index:`notmuch-tag-undo`
|
||||||
|
|
||||||
|
|docstring::notmuch-tag-undo|
|
||||||
|
|
||||||
Buffer navigation
|
Buffer navigation
|
||||||
=================
|
=================
|
||||||
|
|
||||||
|
|
|
@ -278,6 +278,7 @@ This can be used with `notmuch-tag-format-image-data'."
|
||||||
;;; track history of tag operations
|
;;; track history of tag operations
|
||||||
(defvar-local notmuch-tag-history nil
|
(defvar-local notmuch-tag-history nil
|
||||||
"Buffer local history of `notmuch-tag' function.")
|
"Buffer local history of `notmuch-tag' function.")
|
||||||
|
(put 'notmuch-tag-history 'permanent-local t)
|
||||||
|
|
||||||
;;; Format Handling
|
;;; Format Handling
|
||||||
|
|
||||||
|
@ -502,6 +503,19 @@ notmuch-after-tag-hook will be run."
|
||||||
(query query))
|
(query query))
|
||||||
(run-hooks 'notmuch-after-tag-hook)))
|
(run-hooks 'notmuch-after-tag-hook)))
|
||||||
|
|
||||||
|
(defun notmuch-tag-undo ()
|
||||||
|
"Undo the previous tagging operation in the current buffer. Uses
|
||||||
|
buffer local variable `notmuch-tag-history' to determine what
|
||||||
|
that operation was."
|
||||||
|
(interactive)
|
||||||
|
(when (null notmuch-tag-history)
|
||||||
|
(error "no further notmuch undo information"))
|
||||||
|
(let* ((action (pop notmuch-tag-history))
|
||||||
|
(query (plist-get action :query))
|
||||||
|
(changes (notmuch-tag-change-list (plist-get action :tag-changes) t)))
|
||||||
|
(notmuch-tag query changes t))
|
||||||
|
(notmuch-refresh-this-buffer))
|
||||||
|
|
||||||
(defun notmuch-tag-change-list (tags &optional reverse)
|
(defun notmuch-tag-change-list (tags &optional reverse)
|
||||||
"Convert TAGS into a list of tag changes.
|
"Convert TAGS into a list of tag changes.
|
||||||
|
|
||||||
|
|
|
@ -103,5 +103,55 @@ test_emacs '(notmuch-search "subject:\"search race test\" -subject:two")
|
||||||
output=$(notmuch search --output=messages 'tag:search-global-race-tag')
|
output=$(notmuch search --output=messages 'tag:search-global-race-tag')
|
||||||
test_expect_equal "$output" "id:$gen_msg_id_1"
|
test_expect_equal "$output" "id:$gen_msg_id_1"
|
||||||
|
|
||||||
|
test_begin_subtest "undo with empty history is an error"
|
||||||
|
test_emacs "(let ((notmuch-tag-history nil))
|
||||||
|
(test-log-error
|
||||||
|
(notmuch-tag-undo)))
|
||||||
|
"
|
||||||
|
cat <<EOF > EXPECTED
|
||||||
|
(error no further notmuch undo information)
|
||||||
|
EOF
|
||||||
|
test_expect_equal_file EXPECTED MESSAGES
|
||||||
|
|
||||||
|
for mode in search show tree unthreaded; do
|
||||||
|
test_begin_subtest "undo tagging in $mode mode"
|
||||||
|
test_emacs "(let ((notmuch-tag-history nil))
|
||||||
|
(notmuch-$mode \"$os_x_darwin_thread\")
|
||||||
|
(notmuch-test-wait)
|
||||||
|
(execute-kbd-macro \"+tag-to-be-undone-$mode\")
|
||||||
|
(notmuch-tag-undo)
|
||||||
|
(notmuch-test-wait))"
|
||||||
|
count=$(notmuch count "tag:tag-to-be-undone-$mode")
|
||||||
|
test_expect_equal "$count" "0"
|
||||||
|
|
||||||
|
test_begin_subtest "undo tagging in $mode mode (multiple operations)"
|
||||||
|
test_emacs "(let ((notmuch-tag-history nil))
|
||||||
|
(notmuch-$mode \"$os_x_darwin_thread\")
|
||||||
|
(notmuch-test-wait)
|
||||||
|
(execute-kbd-macro \"+one-$mode\")
|
||||||
|
(execute-kbd-macro \"+two-$mode\")
|
||||||
|
(notmuch-tag-undo)
|
||||||
|
(notmuch-test-wait)
|
||||||
|
(execute-kbd-macro \"+three-$mode\"))"
|
||||||
|
output=$(notmuch search $os_x_darwin_thread | notmuch_search_sanitize)
|
||||||
|
notmuch tag "-one-$mode" "-three-$mode" $os_x_darwin_thread
|
||||||
|
test_expect_equal "$output" "thread:XXX 2009-11-18 [4/4] Jjgod Jiang, Alexander Botero-Lowry; [notmuch] Mac OS X/Darwin compatibility issues (inbox one-$mode three-$mode unread)"
|
||||||
|
|
||||||
|
test_begin_subtest "undo tagging in $mode mode (multiple undo)"
|
||||||
|
test_emacs "(let ((notmuch-tag-history nil))
|
||||||
|
(notmuch-$mode \"$os_x_darwin_thread\")
|
||||||
|
(notmuch-test-wait)
|
||||||
|
(execute-kbd-macro \"+one-$mode\")
|
||||||
|
(execute-kbd-macro \"+two-$mode\")
|
||||||
|
(notmuch-tag-undo)
|
||||||
|
(notmuch-test-wait)
|
||||||
|
(notmuch-tag-undo)
|
||||||
|
(notmuch-test-wait)
|
||||||
|
(execute-kbd-macro \"+three-$mode\"))"
|
||||||
|
output=$(notmuch search $os_x_darwin_thread | notmuch_search_sanitize)
|
||||||
|
notmuch tag "-one-$mode" "-three-$mode" $os_x_darwin_thread
|
||||||
|
test_expect_equal "$output" "thread:XXX 2009-11-18 [4/4] Jjgod Jiang, Alexander Botero-Lowry; [notmuch] Mac OS X/Darwin compatibility issues (inbox three-$mode unread)"
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue