* [PATCH 00/11] Move notmuch-tree to mainline
@ 2013-10-29 22:55 Mark Walters
2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters
` (13 more replies)
0 siblings, 14 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
This is a more complete version of the move of pick/tree to
mainline. The previous version was at
id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com
The previous version did not get the autoloading right: it all worked
on my setup as I had stale files around in my tree which were loaded.
This versions builds and tests pass at each stage on a fresh clone.
The diffstat at the bottom of this message is huge, so I include the
rather more informative output from git diff -stat -M here.
Apart from the first patch (which moves 80 lines from notmuch.el to notmuch-lib.el) the total is:
emacs/Makefile.local | 1 +
emacs/notmuch-lib.el | 1 +
emacs/notmuch-show.el | 10 ++++
{contrib/notmuch-pick => emacs}/notmuch-tree.el | 47 ++-----------------
emacs/notmuch.el | 16 +++++++
{contrib/notmuch-pick/test => test}/emacs-tree | 13 -----
test/notmuch-test | 1 +
.../tree.expected-output/notmuch-tree-show-window | 0
.../notmuch-tree-single-thread | 0
.../tree.expected-output/notmuch-tree-tag-inbox | 0
.../notmuch-tree-tag-inbox-tagged | 0
.../notmuch-tree-tag-inbox-thread-tagged | 0
12 files changed, 34 insertions(+), 55 deletions(-)
Obviously this clashes with the remap/help series at
id:1382821479-23384-1-git-send-email-markwalters1009@gmail.com but
rebasing either way would be easy.
Best wishes
Mark
Mark Walters (11):
emacs: move notmuch-help to lib
emacs: tree: remove unneeded declarations
emacs: move notmuch-tree from contrib to mainline
emacs: add tree to the makefile
test: move emacs-tree test into mainline
emacs: tree: remove test for emacs from tree test
emacs: minimal change to autoload notmuch-tree
test: tree: remove require from tests
emacs: move search based tree functions to notmuch.el
emacs: add z to common keymap
emacs: move the show entry to tree into show.el
contrib/notmuch-pick/notmuch-tree.el | 951 --------------------
contrib/notmuch-pick/test/emacs-tree | 210 -----
.../tree.expected-output/notmuch-tree-show-window | 40 -
.../notmuch-tree-single-thread | 6 -
.../tree.expected-output/notmuch-tree-tag-inbox | 53 --
.../notmuch-tree-tag-inbox-tagged | 53 --
.../notmuch-tree-tag-inbox-thread-tagged | 53 --
emacs/Makefile.local | 1 +
emacs/notmuch-lib.el | 88 ++
emacs/notmuch-show.el | 10 +
emacs/notmuch-tree.el | 914 +++++++++++++++++++
emacs/notmuch.el | 103 +--
test/emacs-tree | 197 ++++
test/notmuch-test | 1 +
test/tree.expected-output/notmuch-tree-show-window | 40 +
.../notmuch-tree-single-thread | 6 +
test/tree.expected-output/notmuch-tree-tag-inbox | 53 ++
.../notmuch-tree-tag-inbox-tagged | 53 ++
.../notmuch-tree-tag-inbox-thread-tagged | 53 ++
19 files changed, 1432 insertions(+), 1453 deletions(-)
delete mode 100644 contrib/notmuch-pick/notmuch-tree.el
delete mode 100755 contrib/notmuch-pick/test/emacs-tree
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
create mode 100644 emacs/notmuch-tree.el
create mode 100755 test/emacs-tree
create mode 100644 test/tree.expected-output/notmuch-tree-show-window
create mode 100644 test/tree.expected-output/notmuch-tree-single-thread
create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox
create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged
create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
--
1.7.9.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 01/11] emacs: move notmuch-help to lib
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 02/11] emacs: tree: remove unneeded declarations Mark Walters
` (12 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
notmuch-help is in notmuch.el not notmuch-lib.el and this is
incovenient for the way pick/tree uses it. I think lib makes more
sense anyway so move it there.
---
emacs/notmuch-lib.el | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++
emacs/notmuch.el | 87 --------------------------------------------------
2 files changed, 87 insertions(+), 87 deletions(-)
diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
index 6541282..e7c5c97 100644
--- a/emacs/notmuch-lib.el
+++ b/emacs/notmuch-lib.el
@@ -215,6 +215,93 @@ depending on the value of `notmuch-poll-script'."
(interactive)
(kill-buffer (current-buffer)))
+(defun notmuch-documentation-first-line (symbol)
+ "Return the first line of the documentation string for SYMBOL."
+ (let ((doc (documentation symbol)))
+ (if doc
+ (with-temp-buffer
+ (insert (documentation symbol t))
+ (goto-char (point-min))
+ (let ((beg (point)))
+ (end-of-line)
+ (buffer-substring beg (point))))
+ "")))
+
+(defun notmuch-prefix-key-description (key)
+ "Given a prefix key code, return a human-readable string representation.
+
+This is basically just `format-kbd-macro' but we also convert ESC to M-."
+ (let ((desc (format-kbd-macro (vector key))))
+ (if (string= desc "ESC")
+ "M-"
+ (concat desc " "))))
+
+(defun notmuch-describe-keymap (keymap ua-keys &optional prefix tail)
+ "Return a list of strings, each describing one binding in KEYMAP.
+
+Each string gives a human-readable description of the key and a
+one-line description of the bound function. See `notmuch-help'
+for an overview of how this documentation is extracted.
+
+UA-KEYS should be a key sequence bound to `universal-argument'.
+It will be used to describe bindings of commands that support a
+prefix argument. PREFIX and TAIL are used internally."
+ (map-keymap
+ (lambda (key binding)
+ (cond ((mouse-event-p key) nil)
+ ((keymapp binding)
+ (setq tail
+ (notmuch-describe-keymap
+ binding ua-keys (notmuch-prefix-key-description key) tail)))
+ (t
+ (when (and ua-keys (symbolp binding)
+ (get binding 'notmuch-prefix-doc))
+ ;; Documentation for prefixed command
+ (let ((ua-desc (key-description ua-keys)))
+ (push (concat ua-desc " " prefix (format-kbd-macro (vector key))
+ "\t" (get binding 'notmuch-prefix-doc))
+ tail)))
+ ;; Documentation for command
+ (push (concat prefix (format-kbd-macro (vector key)) "\t"
+ (or (and (symbolp binding) (get binding 'notmuch-doc))
+ (notmuch-documentation-first-line binding)))
+ tail))))
+ keymap)
+ tail)
+
+(defun notmuch-substitute-command-keys (doc)
+ "Like `substitute-command-keys' but with documentation, not function names."
+ (let ((beg 0))
+ (while (string-match "\\\\{\\([^}[:space:]]*\\)}" doc beg)
+ (let* ((keymap-name (substring doc (match-beginning 1) (match-end 1)))
+ (keymap (symbol-value (intern keymap-name)))
+ (ua-keys (where-is-internal 'universal-argument keymap t))
+ (desc-list (notmuch-describe-keymap keymap ua-keys))
+ (desc (mapconcat #'identity desc-list "\n")))
+ (setq doc (replace-match desc 1 1 doc)))
+ (setq beg (match-end 0)))
+ doc))
+
+(defun notmuch-help ()
+ "Display help for the current notmuch mode.
+
+This is similar to `describe-function' for the current major
+mode, but bindings tables are shown with documentation strings
+rather than command names. By default, this uses the first line
+of each command's documentation string. A command can override
+this by setting the 'notmuch-doc property of its command symbol.
+A command that supports a prefix argument can explicitly document
+its prefixed behavior by setting the 'notmuch-prefix-doc property
+of its command symbol."
+ (interactive)
+ (let* ((mode major-mode)
+ (doc (substitute-command-keys (notmuch-substitute-command-keys (documentation mode t)))))
+ (with-current-buffer (generate-new-buffer "*notmuch-help*")
+ (insert doc)
+ (goto-char (point-min))
+ (set-buffer-modified-p nil)
+ (view-buffer (current-buffer) 'kill-buffer-if-not-modified))))
+
(defvar notmuch-buffer-refresh-function nil
"Function to call to refresh the current buffer.")
(make-variable-buffer-local 'notmuch-buffer-refresh-function)
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index d0cd906..19210cb 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -119,93 +119,6 @@ To enter a line break in customize, press \\[quoted-insert] C-j."
(mm-save-part p))))
mm-handle))
-(defun notmuch-documentation-first-line (symbol)
- "Return the first line of the documentation string for SYMBOL."
- (let ((doc (documentation symbol)))
- (if doc
- (with-temp-buffer
- (insert (documentation symbol t))
- (goto-char (point-min))
- (let ((beg (point)))
- (end-of-line)
- (buffer-substring beg (point))))
- "")))
-
-(defun notmuch-prefix-key-description (key)
- "Given a prefix key code, return a human-readable string representation.
-
-This is basically just `format-kbd-macro' but we also convert ESC to M-."
- (let ((desc (format-kbd-macro (vector key))))
- (if (string= desc "ESC")
- "M-"
- (concat desc " "))))
-
-(defun notmuch-describe-keymap (keymap ua-keys &optional prefix tail)
- "Return a list of strings, each describing one binding in KEYMAP.
-
-Each string gives a human-readable description of the key and a
-one-line description of the bound function. See `notmuch-help'
-for an overview of how this documentation is extracted.
-
-UA-KEYS should be a key sequence bound to `universal-argument'.
-It will be used to describe bindings of commands that support a
-prefix argument. PREFIX and TAIL are used internally."
- (map-keymap
- (lambda (key binding)
- (cond ((mouse-event-p key) nil)
- ((keymapp binding)
- (setq tail
- (notmuch-describe-keymap
- binding ua-keys (notmuch-prefix-key-description key) tail)))
- (t
- (when (and ua-keys (symbolp binding)
- (get binding 'notmuch-prefix-doc))
- ;; Documentation for prefixed command
- (let ((ua-desc (key-description ua-keys)))
- (push (concat ua-desc " " prefix (format-kbd-macro (vector key))
- "\t" (get binding 'notmuch-prefix-doc))
- tail)))
- ;; Documentation for command
- (push (concat prefix (format-kbd-macro (vector key)) "\t"
- (or (and (symbolp binding) (get binding 'notmuch-doc))
- (notmuch-documentation-first-line binding)))
- tail))))
- keymap)
- tail)
-
-(defun notmuch-substitute-command-keys (doc)
- "Like `substitute-command-keys' but with documentation, not function names."
- (let ((beg 0))
- (while (string-match "\\\\{\\([^}[:space:]]*\\)}" doc beg)
- (let* ((keymap-name (substring doc (match-beginning 1) (match-end 1)))
- (keymap (symbol-value (intern keymap-name)))
- (ua-keys (where-is-internal 'universal-argument keymap t))
- (desc-list (notmuch-describe-keymap keymap ua-keys))
- (desc (mapconcat #'identity desc-list "\n")))
- (setq doc (replace-match desc 1 1 doc)))
- (setq beg (match-end 0)))
- doc))
-
-(defun notmuch-help ()
- "Display help for the current notmuch mode.
-
-This is similar to `describe-function' for the current major
-mode, but bindings tables are shown with documentation strings
-rather than command names. By default, this uses the first line
-of each command's documentation string. A command can override
-this by setting the 'notmuch-doc property of its command symbol.
-A command that supports a prefix argument can explicitly document
-its prefixed behavior by setting the 'notmuch-prefix-doc property
-of its command symbol."
- (interactive)
- (let* ((mode major-mode)
- (doc (substitute-command-keys (notmuch-substitute-command-keys (documentation mode t)))))
- (with-current-buffer (generate-new-buffer "*notmuch-help*")
- (insert doc)
- (goto-char (point-min))
- (set-buffer-modified-p nil)
- (view-buffer (current-buffer) 'kill-buffer-if-not-modified))))
-
(require 'hl-line)
(defun notmuch-hl-line-mode ()
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 02/11] emacs: tree: remove unneeded declarations
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline Mark Walters
` (11 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
There are some crufty declare-functions and requires in notmuch-tree:
since it requires notmuch.el itself this all works but in preparation
for the move to mainline tidy this up.
---
contrib/notmuch-pick/notmuch-tree.el | 13 ++++---------
1 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/contrib/notmuch-pick/notmuch-tree.el b/contrib/notmuch-pick/notmuch-tree.el
index 512589f..d3330a0 100644
--- a/contrib/notmuch-pick/notmuch-tree.el
+++ b/contrib/notmuch-pick/notmuch-tree.el
@@ -27,20 +27,15 @@
(require 'notmuch-lib)
(require 'notmuch-query)
(require 'notmuch-show)
+(require 'notmuch-tag)
+(require 'notmuch-parser)
(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here
(eval-when-compile (require 'cl))
-
+(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line))
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
-(declare-function notmuch-show "notmuch-show" (&rest args))
-(declare-function notmuch-tag "notmuch" (query &rest tags))
-(declare-function notmuch-show-strip-re "notmuch-show" (subject))
-(declare-function notmuch-show-spaces-n "notmuch-show" (n))
(declare-function notmuch-read-query "notmuch" (prompt))
-(declare-function notmuch-read-tag-changes "notmuch" (current-tags &optional prompt initial-input))
-(declare-function notmuch-update-tags "notmuch" (current-tags tag-changes))
-(declare-function notmuch-hello-trim "notmuch-hello" (search))
-(declare-function notmuch-search-find-thread-id "notmuch" ())
+(declare-function notmuch-search-find-thread-id "notmuch" (&optional bare))
(declare-function notmuch-search-find-subject "notmuch" ())
;; the following variable is defined in notmuch.el
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters
2013-10-29 22:55 ` [PATCH 02/11] emacs: tree: remove unneeded declarations Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 04/11] emacs: add tree to the makefile Mark Walters
` (10 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
---
contrib/notmuch-pick/notmuch-tree.el | 946 ----------------------------------
emacs/notmuch-tree.el | 946 ++++++++++++++++++++++++++++++++++
2 files changed, 946 insertions(+), 946 deletions(-)
delete mode 100644 contrib/notmuch-pick/notmuch-tree.el
create mode 100644 emacs/notmuch-tree.el
diff --git a/contrib/notmuch-pick/notmuch-tree.el b/contrib/notmuch-pick/notmuch-tree.el
deleted file mode 100644
index d3330a0..0000000
--- a/contrib/notmuch-pick/notmuch-tree.el
+++ /dev/null
@@ -1,946 +0,0 @@
-;; notmuch-tree.el --- displaying notmuch forests.
-;;
-;; Copyright © Carl Worth
-;; Copyright © David Edmondson
-;; Copyright © Mark Walters
-;;
-;; This file is part of Notmuch.
-;;
-;; Notmuch is free software: you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-;;
-;; Notmuch is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with Notmuch. If not, see <http://www.gnu.org/licenses/>.
-;;
-;; Authors: David Edmondson <dme@dme.org>
-;; Mark Walters <markwalters1009@gmail.com>
-
-(require 'mail-parse)
-
-(require 'notmuch-lib)
-(require 'notmuch-query)
-(require 'notmuch-show)
-(require 'notmuch-tag)
-(require 'notmuch-parser)
-(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here
-
-(eval-when-compile (require 'cl))
-(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line))
-(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
-(declare-function notmuch-read-query "notmuch" (prompt))
-(declare-function notmuch-search-find-thread-id "notmuch" (&optional bare))
-(declare-function notmuch-search-find-subject "notmuch" ())
-
-;; the following variable is defined in notmuch.el
-(defvar notmuch-search-query-string)
-
-(defgroup notmuch-tree nil
- "Showing message and thread structure."
- :group 'notmuch)
-
-(defcustom notmuch-tree-show-out nil
- "View selected messages in new window rather than split-pane."
- :type 'boolean
- :group 'notmuch-tree)
-
-(defcustom notmuch-tree-result-format
- `(("date" . "%12s ")
- ("authors" . "%-20s")
- ((("tree" . "%s")("subject" . "%s")) ." %-54s ")
- ("tags" . "(%s)"))
- "Result formatting for Tree view. Supported fields are: date,
- authors, subject, tree, tags. Tree means the thread tree
- box graphics. The field may also be a list in which case
- the formatting rules are applied recursively and then the
- output of all the fields in the list is inserted
- according to format-string.
-
-Note the author string should not contain
- whitespace (put it in the neighbouring fields instead).
- For example:
- (setq notmuch-tree-result-format \(\(\"authors\" . \"%-40s\"\)
- \(\"subject\" . \"%s\"\)\)\)"
- :type '(alist :key-type (string) :value-type (string))
- :group 'notmuch-tree)
-
-;; Faces for messages that match the query.
-(defface notmuch-tree-match-date-face
- '((t :inherit default))
- "Face used in tree mode for the date in messages matching the query."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-match-author-face
- '((((class color)
- (background dark))
- (:foreground "OliveDrab1"))
- (((class color)
- (background light))
- (:foreground "dark blue"))
- (t
- (:bold t)))
- "Face used in tree mode for the date in messages matching the query."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-match-subject-face
- '((t :inherit default))
- "Face used in tree mode for the subject in messages matching the query."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-match-tree-face
- '((t :inherit default))
- "Face used in tree mode for the thread tree block graphics in messages matching the query."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-match-tag-face
- '((((class color)
- (background dark))
- (:foreground "OliveDrab1"))
- (((class color)
- (background light))
- (:foreground "navy blue" :bold t))
- (t
- (:bold t)))
- "Face used in tree mode for tags in messages matching the query."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-;; Faces for messages that do not match the query.
-(defface notmuch-tree-no-match-date-face
- '((t (:foreground "gray")))
- "Face used in tree mode for non-matching dates."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-no-match-subject-face
- '((t (:foreground "gray")))
- "Face used in tree mode for non-matching subjects."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-no-match-tree-face
- '((t (:foreground "gray")))
- "Face used in tree mode for the thread tree block graphics in messages matching the query."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-no-match-author-face
- '((t (:foreground "gray")))
- "Face used in tree mode for the date in messages matching the query."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defface notmuch-tree-no-match-tag-face
- '((t (:foreground "gray")))
- "Face used in tree mode face for non-matching tags."
- :group 'notmuch-tree
- :group 'notmuch-faces)
-
-(defvar notmuch-tree-previous-subject
- "The subject of the most recent result shown during the async display")
-(make-variable-buffer-local 'notmuch-tree-previous-subject)
-
-(defvar notmuch-tree-basic-query nil
- "A buffer local copy of argument query to the function notmuch-tree")
-(make-variable-buffer-local 'notmuch-tree-basic-query)
-
-(defvar notmuch-tree-query-context nil
- "A buffer local copy of argument query-context to the function notmuch-tree")
-(make-variable-buffer-local 'notmuch-tree-query-context)
-
-(defvar notmuch-tree-target-msg nil
- "A buffer local copy of argument target to the function notmuch-tree")
-(make-variable-buffer-local 'notmuch-tree-target-msg)
-
-(defvar notmuch-tree-open-target nil
- "A buffer local copy of argument open-target to the function notmuch-tree")
-(make-variable-buffer-local 'notmuch-tree-open-target)
-
-(defvar notmuch-tree-message-window nil
- "The window of the message pane.
-
-It is set in both the tree buffer and the child show buffer. It
-is used to try and close the message pane when quitting tree view
-or the child show buffer.")
-(make-variable-buffer-local 'notmuch-tree-message-window)
-(put 'notmuch-tree-message-window 'permanent-local t)
-
-(defvar notmuch-tree-message-buffer nil
- "The buffer name of the show buffer in the message pane.
-
-This is used to try and make sure we don't close the message pane
-if the user has loaded a different buffer in that window.")
-(make-variable-buffer-local 'notmuch-tree-message-buffer)
-(put 'notmuch-tree-message-buffer 'permanent-local t)
-
-(defun notmuch-tree-to-message-pane (func)
- "Execute FUNC in message pane.
-
-This function returns a function (so can be used as a keybinding)
-which executes function FUNC in the message pane if it is
-open (if the message pane is closed it does nothing)."
- `(lambda ()
- ,(concat "(In message pane) " (documentation func t))
- (interactive)
- (when (window-live-p notmuch-tree-message-window)
- (with-selected-window notmuch-tree-message-window
- (call-interactively #',func)))))
-
-(defun notmuch-tree-button-activate (&optional button)
- "Activate BUTTON or button at point
-
-This function does not give an error if there is no button."
- (interactive)
- (let ((button (or button (button-at (point)))))
- (when button (button-activate button))))
-
-(defun notmuch-tree-close-message-pane-and (func)
- "Close message pane and execute FUNC.
-
-This function returns a function (so can be used as a keybinding)
-which closes the message pane if open and then executes function
-FUNC."
- `(lambda ()
- ,(concat "(Close message pane and) " (documentation func t))
- (interactive)
- (notmuch-tree-close-message-window)
- (call-interactively #',func)))
-
-(defvar notmuch-tree-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map notmuch-common-keymap)
- ;; The following override the global keymap.
- ;; Override because we want to close message pane first.
- (define-key map "?" (notmuch-tree-close-message-pane-and #'notmuch-help))
- ;; Override because we first close message pane and then close tree buffer.
- (define-key map "q" 'notmuch-tree-quit)
- ;; Override because we close message pane after the search query is entered.
- (define-key map "s" 'notmuch-tree-to-search)
- ;; Override because we want to close message pane first.
- (define-key map "m" (notmuch-tree-close-message-pane-and #'notmuch-mua-new-mail))
-
- ;; these use notmuch-show functions directly
- (define-key map "|" 'notmuch-show-pipe-message)
- (define-key map "w" 'notmuch-show-save-attachments)
- (define-key map "v" 'notmuch-show-view-all-mime-parts)
- (define-key map "c" 'notmuch-show-stash-map)
-
- ;; these apply to the message pane
- (define-key map (kbd "M-TAB") (notmuch-tree-to-message-pane #'notmuch-show-previous-button))
- (define-key map (kbd "<backtab>") (notmuch-tree-to-message-pane #'notmuch-show-previous-button))
- (define-key map (kbd "TAB") (notmuch-tree-to-message-pane #'notmuch-show-next-button))
- (define-key map "e" (notmuch-tree-to-message-pane #'notmuch-tree-button-activate))
-
- ;; bindings from show (or elsewhere) but we close the message pane first.
- (define-key map "f" (notmuch-tree-close-message-pane-and #'notmuch-show-forward-message))
- (define-key map "r" (notmuch-tree-close-message-pane-and #'notmuch-show-reply-sender))
- (define-key map "R" (notmuch-tree-close-message-pane-and #'notmuch-show-reply))
- (define-key map "V" (notmuch-tree-close-message-pane-and #'notmuch-show-view-raw-message))
-
- ;; The main tree view bindings
- (define-key map (kbd "RET") 'notmuch-tree-show-message)
- (define-key map [mouse-1] 'notmuch-tree-show-message)
- (define-key map "x" 'notmuch-tree-quit)
- (define-key map "A" 'notmuch-tree-archive-thread)
- (define-key map "a" 'notmuch-tree-archive-message-then-next)
- (define-key map "=" 'notmuch-tree-refresh-view)
- (define-key map "z" 'notmuch-tree-to-tree)
- (define-key map "n" 'notmuch-tree-next-matching-message)
- (define-key map "p" 'notmuch-tree-prev-matching-message)
- (define-key map "N" 'notmuch-tree-next-message)
- (define-key map "P" 'notmuch-tree-prev-message)
- (define-key map (kbd "M-p") 'notmuch-tree-prev-thread)
- (define-key map (kbd "M-n") 'notmuch-tree-next-thread)
- (define-key map "-" 'notmuch-tree-remove-tag)
- (define-key map "+" 'notmuch-tree-add-tag)
- (define-key map "*" 'notmuch-tree-tag-thread)
- (define-key map " " 'notmuch-tree-scroll-or-next)
- (define-key map "b" 'notmuch-tree-scroll-message-window-back)
- map))
-(fset 'notmuch-tree-mode-map notmuch-tree-mode-map)
-
-(defun notmuch-tree-get-message-properties ()
- "Return the properties of the current message as a plist.
-
-Some useful entries are:
-:headers - Property list containing the headers :Date, :Subject, :From, etc.
-:tags - Tags for this message"
- (save-excursion
- (beginning-of-line)
- (get-text-property (point) :notmuch-message-properties)))
-
-;; XXX This should really be a lib function but we are trying to
-;; reduce impact on the code base.
-(defun notmuch-show-get-prop (prop &optional props)
- "This is a tree view overridden version of notmuch-show-get-prop
-
-It gets property PROP from PROPS or, if PROPS is nil, the current
-message in either tree or show. This means that several functions
-in notmuch-show now work unchanged in tree as they just need the
-correct message properties."
- (let ((props (or props
- (cond ((eq major-mode 'notmuch-show-mode)
- (notmuch-show-get-message-properties))
- ((eq major-mode 'notmuch-tree-mode)
- (notmuch-tree-get-message-properties))))))
- (plist-get props prop)))
-
-(defun notmuch-tree-set-message-properties (props)
- (save-excursion
- (beginning-of-line)
- (put-text-property (point) (+ (point) 1) :notmuch-message-properties props)))
-
-(defun notmuch-tree-set-prop (prop val &optional props)
- (let ((inhibit-read-only t)
- (props (or props
- (notmuch-tree-get-message-properties))))
- (plist-put props prop val)
- (notmuch-tree-set-message-properties props)))
-
-(defun notmuch-tree-get-prop (prop &optional props)
- (let ((props (or props
- (notmuch-tree-get-message-properties))))
- (plist-get props prop)))
-
-(defun notmuch-tree-set-tags (tags)
- "Set the tags of the current message."
- (notmuch-tree-set-prop :tags tags))
-
-(defun notmuch-tree-get-tags ()
- "Return the tags of the current message."
- (notmuch-tree-get-prop :tags))
-
-(defun notmuch-tree-get-message-id ()
- "Return the message id of the current message."
- (let ((id (notmuch-tree-get-prop :id)))
- (if id
- (notmuch-id-to-query id)
- nil)))
-
-(defun notmuch-tree-get-match ()
- "Return whether the current message is a match."
- (interactive)
- (notmuch-tree-get-prop :match))
-
-(defun notmuch-tree-refresh-result ()
- "Redisplay the current message line.
-
-This redisplays the current line based on the messages
-properties (as they are now). This is used when tags are
-updated."
- (let ((init-point (point))
- (end (line-end-position))
- (msg (notmuch-tree-get-message-properties))
- (inhibit-read-only t))
- (beginning-of-line)
- ;; This is a little tricky: we override
- ;; notmuch-tree-previous-subject to get the decision between
- ;; ... and a subject right and it stops notmuch-tree-insert-msg
- ;; from overwriting the buffer local copy of
- ;; notmuch-tree-previous-subject if this is called while the
- ;; buffer is displaying.
- (let ((notmuch-tree-previous-subject (notmuch-tree-get-prop :previous-subject)))
- (delete-region (point) (1+ (line-end-position)))
- (notmuch-tree-insert-msg msg))
- (let ((new-end (line-end-position)))
- (goto-char (if (= init-point end)
- new-end
- (min init-point (- new-end 1)))))))
-
-(defun notmuch-tree-tag-update-display (&optional tag-changes)
- "Update display for TAG-CHANGES to current message.
-
-Does NOT change the database."
- (let* ((current-tags (notmuch-tree-get-tags))
- (new-tags (notmuch-update-tags current-tags tag-changes)))
- (unless (equal current-tags new-tags)
- (notmuch-tree-set-tags new-tags)
- (notmuch-tree-refresh-result))))
-
-(defun notmuch-tree-tag (tag-changes)
- "Change tags for the current message"
- (interactive
- (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message")))
- (notmuch-tag (notmuch-tree-get-message-id) tag-changes)
- (notmuch-tree-tag-update-display tag-changes))
-
-(defun notmuch-tree-add-tag (tag-changes)
- "Same as `notmuch-tree-tag' but sets initial input to '+'."
- (interactive
- (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "+")))
- (notmuch-tree-tag tag-changes))
-
-(defun notmuch-tree-remove-tag (tag-changes)
- "Same as `notmuch-tree-tag' but sets initial input to '-'."
- (interactive
- (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "-")))
- (notmuch-tree-tag tag-changes))
-
-;; The next two functions close the message window before calling
-;; notmuch-search or notmuch-tree but they do so after the user has
-;; entered the query (in case the user was basing the query on
-;; something in the message window).
-
-(defun notmuch-tree-to-search ()
- "Run \"notmuch search\" with the given `query' and display results."
- (interactive)
- (let ((query (notmuch-read-query "Notmuch search: ")))
- (notmuch-tree-close-message-window)
- (notmuch-search query)))
-
-(defun notmuch-tree-to-tree ()
- "Run a query and display results in Tree view"
- (interactive)
- (let ((query (notmuch-read-query "Notmuch tree view search: ")))
- (notmuch-tree-close-message-window)
- (notmuch-tree query)))
-
-;; This function should be in notmuch-show.el but be we trying to
-;; minimise impact on the rest of the codebase.
-(defun notmuch-tree-from-show-current-query ()
- "Call notmuch tree with the current query"
- (interactive)
- (notmuch-tree notmuch-show-thread-id
- notmuch-show-query-context
- (notmuch-show-get-message-id)))
-
-;; This function should be in notmuch.el but be we trying to minimise
-;; impact on the rest of the codebase.
-(defun notmuch-tree-from-search-current-query ()
- "Call notmuch tree with the current query"
- (interactive)
- (notmuch-tree notmuch-search-query-string))
-
-;; This function should be in notmuch.el but be we trying to minimise
-;; impact on the rest of the codebase.
-(defun notmuch-tree-from-search-thread ()
- "Show the selected thread with notmuch-tree"
- (interactive)
- (notmuch-tree (notmuch-search-find-thread-id)
- notmuch-search-query-string
- nil
- (notmuch-prettify-subject (notmuch-search-find-subject))
- t))
-
-(defun notmuch-tree-message-window-kill-hook ()
- "Close the message pane when exiting the show buffer."
- (let ((buffer (current-buffer)))
- (when (and (window-live-p notmuch-tree-message-window)
- (eq (window-buffer notmuch-tree-message-window) buffer))
- ;; We do not want an error if this is the sole window in the
- ;; frame and I do not know how to test for that in emacs pre
- ;; 24. Hence we just ignore-errors.
- (ignore-errors
- (delete-window notmuch-tree-message-window)))))
-
-(defun notmuch-tree-show-message-in ()
- "Show the current message (in split-pane)."
- (interactive)
- (let ((id (notmuch-tree-get-message-id))
- (inhibit-read-only t)
- buffer)
- (when id
- ;; We close and reopen the window to kill off un-needed buffers
- ;; this might cause flickering but seems ok.
- (notmuch-tree-close-message-window)
- (setq notmuch-tree-message-window
- (split-window-vertically (/ (window-height) 4)))
- (with-selected-window notmuch-tree-message-window
- ;; Since we are only displaying one message do not indent.
- (let ((notmuch-show-indent-messages-width 0)
- (notmuch-show-only-matching-messages t))
- (setq buffer (notmuch-show id))))
- ;; We need the `let' as notmuch-tree-message-window is buffer local.
- (let ((window notmuch-tree-message-window))
- (with-current-buffer buffer
- (setq notmuch-tree-message-window window)
- (add-hook 'kill-buffer-hook 'notmuch-tree-message-window-kill-hook)))
- (when notmuch-show-mark-read-tags
- (notmuch-tree-tag-update-display notmuch-show-mark-read-tags))
- (setq notmuch-tree-message-buffer buffer))))
-
-(defun notmuch-tree-show-message-out ()
- "Show the current message (in whole window)."
- (interactive)
- (let ((id (notmuch-tree-get-message-id))
- (inhibit-read-only t)
- buffer)
- (when id
- ;; We close the window to kill off un-needed buffers.
- (notmuch-tree-close-message-window)
- (notmuch-show id))))
-
-(defun notmuch-tree-show-message (arg)
- "Show the current message.
-
-Shows in split pane or whole window according to value of
-`notmuch-tree-show-out'. A prefix argument reverses the choice."
- (interactive "P")
- (if (or (and notmuch-tree-show-out (not arg))
- (and (not notmuch-tree-show-out) arg))
- (notmuch-tree-show-message-out)
- (notmuch-tree-show-message-in)))
-
-(defun notmuch-tree-scroll-message-window ()
- "Scroll the message window (if it exists)"
- (interactive)
- (when (window-live-p notmuch-tree-message-window)
- (with-selected-window notmuch-tree-message-window
- (if (pos-visible-in-window-p (point-max))
- t
- (scroll-up)))))
-
-(defun notmuch-tree-scroll-message-window-back ()
- "Scroll the message window back(if it exists)"
- (interactive)
- (when (window-live-p notmuch-tree-message-window)
- (with-selected-window notmuch-tree-message-window
- (if (pos-visible-in-window-p (point-min))
- t
- (scroll-down)))))
-
-(defun notmuch-tree-scroll-or-next ()
- "Scroll the message window. If it at end go to next message."
- (interactive)
- (when (notmuch-tree-scroll-message-window)
- (notmuch-tree-next-matching-message)))
-
-(defun notmuch-tree-quit ()
- "Close the split view or exit tree."
- (interactive)
- (unless (notmuch-tree-close-message-window)
- (kill-buffer (current-buffer))))
-
-(defun notmuch-tree-close-message-window ()
- "Close the message-window. Return t if close succeeds."
- (interactive)
- (when (and (window-live-p notmuch-tree-message-window)
- (eq (window-buffer notmuch-tree-message-window) notmuch-tree-message-buffer))
- (delete-window notmuch-tree-message-window)
- (unless (get-buffer-window-list notmuch-tree-message-buffer)
- (kill-buffer notmuch-tree-message-buffer))
- t))
-
-(defun notmuch-tree-archive-message (&optional unarchive)
- "Archive the current message.
-
-Archive the current message by applying the tag changes in
-`notmuch-archive-tags' to it. If a prefix argument is given, the
-message will be \"unarchived\", i.e. the tag changes in
-`notmuch-archive-tags' will be reversed."
- (interactive "P")
- (when notmuch-archive-tags
- (notmuch-tree-tag (notmuch-tag-change-list notmuch-archive-tags unarchive))))
-
-(defun notmuch-tree-archive-message-then-next (&optional unarchive)
- "Archive the current message and move to next matching message."
- (interactive "P")
- (notmuch-tree-archive-message unarchive)
- (notmuch-tree-next-matching-message))
-
-(defun notmuch-tree-next-message ()
- "Move to next message."
- (interactive)
- (forward-line)
- (when (window-live-p notmuch-tree-message-window)
- (notmuch-tree-show-message-in)))
-
-(defun notmuch-tree-prev-message ()
- "Move to previous message."
- (interactive)
- (forward-line -1)
- (when (window-live-p notmuch-tree-message-window)
- (notmuch-tree-show-message-in)))
-
-(defun notmuch-tree-prev-matching-message ()
- "Move to previous matching message."
- (interactive)
- (forward-line -1)
- (while (and (not (bobp)) (not (notmuch-tree-get-match)))
- (forward-line -1))
- (when (window-live-p notmuch-tree-message-window)
- (notmuch-tree-show-message-in)))
-
-(defun notmuch-tree-next-matching-message ()
- "Move to next matching message."
- (interactive)
- (forward-line)
- (while (and (not (eobp)) (not (notmuch-tree-get-match)))
- (forward-line))
- (when (window-live-p notmuch-tree-message-window)
- (notmuch-tree-show-message-in)))
-
-(defun notmuch-tree-refresh-view ()
- "Refresh view."
- (interactive)
- (let ((inhibit-read-only t)
- (basic-query notmuch-tree-basic-query)
- (query-context notmuch-tree-query-context)
- (target (notmuch-tree-get-message-id)))
- (erase-buffer)
- (notmuch-tree-worker basic-query
- query-context
- target)))
-
-(defun notmuch-tree-thread-top ()
- (when (notmuch-tree-get-message-properties)
- (while (not (or (notmuch-tree-get-prop :first) (eobp)))
- (forward-line -1))))
-
-(defun notmuch-tree-prev-thread ()
- (interactive)
- (forward-line -1)
- (notmuch-tree-thread-top))
-
-(defun notmuch-tree-next-thread ()
- (interactive)
- (forward-line 1)
- (while (not (or (notmuch-tree-get-prop :first) (eobp)))
- (forward-line 1)))
-
-(defun notmuch-tree-thread-mapcar (function)
- "Iterate through all messages in the current thread
- and call FUNCTION for side effects."
- (save-excursion
- (notmuch-tree-thread-top)
- (loop collect (funcall function)
- do (forward-line)
- while (and (notmuch-tree-get-message-properties)
- (not (notmuch-tree-get-prop :first))))))
-
-(defun notmuch-tree-get-messages-ids-thread-search ()
- "Return a search string for all message ids of messages in the current thread."
- (mapconcat 'identity
- (notmuch-tree-thread-mapcar 'notmuch-tree-get-message-id)
- " or "))
-
-(defun notmuch-tree-tag-thread (tag-changes)
- "Tag all messages in the current thread"
- (interactive
- (let ((tags (apply #'append (notmuch-tree-thread-mapcar
- (lambda () (notmuch-tree-get-tags))))))
- (list (notmuch-read-tag-changes tags "Tag thread"))))
- (when (notmuch-tree-get-message-properties)
- (notmuch-tag (notmuch-tree-get-messages-ids-thread-search) tag-changes)
- (notmuch-tree-thread-mapcar
- (lambda () (notmuch-tree-tag-update-display tag-changes)))))
-
-(defun notmuch-tree-archive-thread (&optional unarchive)
- "Archive each message in thread.
-
-Archive each message currently shown by applying the tag changes
-in `notmuch-archive-tags' to each. If a prefix argument is given,
-the messages will be \"unarchived\", i.e. the tag changes in
-`notmuch-archive-tags' will be reversed.
-
-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."
- (interactive "P")
- (when notmuch-archive-tags
- (notmuch-tree-tag-thread
- (notmuch-tag-change-list notmuch-archive-tags unarchive))))
-
-;; Functions below here display the tree buffer itself.
-
-(defun notmuch-tree-clean-address (address)
- "Try to clean a single email ADDRESS for display. Return
-AUTHOR_NAME if present, otherwise return AUTHOR_EMAIL. Return
-unchanged ADDRESS if parsing fails."
- (let* ((clean-address (notmuch-clean-address address))
- (p-address (car clean-address))
- (p-name (cdr clean-address)))
-
- ;; If we have a name return that otherwise return the address.
- (or p-name p-address)))
-
-(defun notmuch-tree-format-field (field format-string msg)
- "Format a FIELD of MSG according to FORMAT-STRING and return string"
- (let* ((headers (plist-get msg :headers))
- (match (plist-get msg :match)))
- (cond
- ((listp field)
- (format format-string (notmuch-tree-format-field-list field msg)))
-
- ((string-equal field "date")
- (let ((face (if match
- 'notmuch-tree-match-date-face
- 'notmuch-tree-no-match-date-face)))
- (propertize (format format-string (plist-get msg :date_relative)) 'face face)))
-
- ((string-equal field "tree")
- (let ((tree-status (plist-get msg :tree-status))
- (face (if match
- 'notmuch-tree-match-tree-face
- 'notmuch-tree-no-match-tree-face)))
-
- (propertize (format format-string
- (mapconcat #'identity (reverse tree-status) ""))
- 'face face)))
-
- ((string-equal field "subject")
- (let ((bare-subject (notmuch-show-strip-re (plist-get headers :Subject)))
- (previous-subject notmuch-tree-previous-subject)
- (face (if match
- 'notmuch-tree-match-subject-face
- 'notmuch-tree-no-match-subject-face)))
-
- (setq notmuch-tree-previous-subject bare-subject)
- (propertize (format format-string
- (if (string= previous-subject bare-subject)
- " ..."
- bare-subject))
- 'face face)))
-
- ((string-equal field "authors")
- (let ((author (notmuch-tree-clean-address (plist-get headers :From)))
- (len (length (format format-string "")))
- (face (if match
- 'notmuch-tree-match-author-face
- 'notmuch-tree-no-match-author-face)))
- (when (> (length author) len)
- (setq author (substring author 0 len)))
- (propertize (format format-string author) 'face face)))
-
- ((string-equal field "tags")
- (let ((tags (plist-get msg :tags))
- (face (if match
- 'notmuch-tree-match-tag-face
- 'notmuch-tree-no-match-tag-face)))
- (propertize (format format-string
- (mapconcat #'identity tags ", "))
- 'face face))))))
-
-
-(defun notmuch-tree-format-field-list (field-list msg)
- "Format fields of MSG according to FIELD-LIST and return string"
- (let (result-string)
- (dolist (spec field-list result-string)
- (let ((field-string (notmuch-tree-format-field (car spec) (cdr spec) msg)))
- (setq result-string (concat result-string field-string))))))
-
-(defun notmuch-tree-insert-msg (msg)
- "Insert the message MSG according to notmuch-tree-result-format"
- ;; We need to save the previous subject as it will get overwritten
- ;; by the insert-field calls.
- (let ((previous-subject notmuch-tree-previous-subject))
- (insert (notmuch-tree-format-field-list notmuch-tree-result-format msg))
- (notmuch-tree-set-message-properties msg)
- (notmuch-tree-set-prop :previous-subject previous-subject)
- (insert "\n")))
-
-(defun notmuch-tree-goto-and-insert-msg (msg)
- "Insert msg at the end of the buffer. Move point to msg if it is the target"
- (save-excursion
- (goto-char (point-max))
- (notmuch-tree-insert-msg msg))
- (let ((msg-id (notmuch-id-to-query (plist-get msg :id)))
- (target notmuch-tree-target-msg))
- (when (or (and (not target) (plist-get msg :match))
- (string= msg-id target))
- (setq notmuch-tree-target-msg "found")
- (goto-char (point-max))
- (forward-line -1)
- (when notmuch-tree-open-target
- (notmuch-tree-show-message-in)))))
-
-(defun notmuch-tree-insert-tree (tree depth tree-status first last)
- "Insert the message tree TREE at depth DEPTH in the current thread.
-
-A message tree is another name for a single sub-thread: i.e., a
-message together with all its descendents."
- (let ((msg (car tree))
- (replies (cadr tree)))
-
- (cond
- ((and (< 0 depth) (not last))
- (push "├" tree-status))
- ((and (< 0 depth) last)
- (push "╰" tree-status))
- ((and (eq 0 depth) first last)
-;; (push "─" tree-status)) choice between this and next line is matter of taste.
- (push " " tree-status))
- ((and (eq 0 depth) first (not last))
- (push "┬" tree-status))
- ((and (eq 0 depth) (not first) last)
- (push "╰" tree-status))
- ((and (eq 0 depth) (not first) (not last))
- (push "├" tree-status)))
-
- (push (concat (if replies "┬" "─") "►") tree-status)
- (plist-put msg :first (and first (eq 0 depth)))
- (notmuch-tree-goto-and-insert-msg (plist-put msg :tree-status tree-status))
- (pop tree-status)
- (pop tree-status)
-
- (if last
- (push " " tree-status)
- (push "│" tree-status))
-
- (notmuch-tree-insert-thread replies (1+ depth) tree-status)))
-
-(defun notmuch-tree-insert-thread (thread depth tree-status)
- "Insert the collection of sibling sub-threads THREAD at depth DEPTH in the current forest."
- (let ((n (length thread)))
- (loop for tree in thread
- for count from 1 to n
-
- do (notmuch-tree-insert-tree tree depth tree-status (eq count 1) (eq count n)))))
-
-(defun notmuch-tree-insert-forest-thread (forest-thread)
- "Insert a single complete thread."
- (let (tree-status)
- ;; Reset at the start of each main thread.
- (setq notmuch-tree-previous-subject nil)
- (notmuch-tree-insert-thread forest-thread 0 tree-status)))
-
-(defun notmuch-tree-insert-forest (forest)
- "Insert a forest of threads.
-
-This function inserts a collection of several complete threads as
-passed to it by notmuch-tree-process-filter."
- (mapc 'notmuch-tree-insert-forest-thread forest))
-
-(defun notmuch-tree-mode ()
- "Major mode displaying messages (as opposed to threads) of of a notmuch search.
-
-This buffer contains the results of a \"notmuch tree\" of your
-email archives. Each line in the buffer represents a single
-message giving the relative date, the author, subject, and any
-tags.
-
-Pressing \\[notmuch-tree-show-message] on any line displays that message.
-
-Complete list of currently available key bindings:
-
-\\{notmuch-tree-mode-map}"
-
- (interactive)
- (kill-all-local-variables)
- (setq notmuch-buffer-refresh-function #'notmuch-tree-refresh-view)
- (use-local-map notmuch-tree-mode-map)
- (setq major-mode 'notmuch-tree-mode
- mode-name "notmuch-tree")
- (hl-line-mode 1)
- (setq buffer-read-only t
- truncate-lines t))
-
-(defun notmuch-tree-process-sentinel (proc msg)
- "Add a message to let user know when \"notmuch tree\" exits"
- (let ((buffer (process-buffer proc))
- (status (process-status proc))
- (exit-status (process-exit-status proc))
- (never-found-target-thread nil))
- (when (memq status '(exit signal))
- (kill-buffer (process-get proc 'parse-buf))
- (if (buffer-live-p buffer)
- (with-current-buffer buffer
- (save-excursion
- (let ((inhibit-read-only t)
- (atbob (bobp)))
- (goto-char (point-max))
- (if (eq status 'signal)
- (insert "Incomplete search results (tree view process was killed).\n"))
- (when (eq status 'exit)
- (insert "End of search results.")
- (unless (= exit-status 0)
- (insert (format " (process returned %d)" exit-status)))
- (insert "\n")))))))))
-
-(defun notmuch-tree-process-filter (proc string)
- "Process and filter the output of \"notmuch show\" for tree view"
- (let ((results-buf (process-buffer proc))
- (parse-buf (process-get proc 'parse-buf))
- (inhibit-read-only t)
- done)
- (if (not (buffer-live-p results-buf))
- (delete-process proc)
- (with-current-buffer parse-buf
- ;; Insert new data
- (save-excursion
- (goto-char (point-max))
- (insert string))
- (notmuch-sexp-parse-partial-list 'notmuch-tree-insert-forest-thread
- results-buf)))))
-
-(defun notmuch-tree-worker (basic-query &optional query-context target open-target)
- "Insert the tree view of the search in the current buffer.
-
-This is is a helper function for notmuch-tree. The arguments are
-the same as for the function notmuch-tree."
- (interactive)
- (notmuch-tree-mode)
- (setq notmuch-tree-basic-query basic-query)
- (setq notmuch-tree-query-context query-context)
- (setq notmuch-tree-target-msg target)
- (setq notmuch-tree-open-target open-target)
-
- (erase-buffer)
- (goto-char (point-min))
- (let* ((search-args (concat basic-query
- (if query-context (concat " and (" query-context ")"))
- ))
- (message-arg "--entire-thread"))
- (if (equal (car (process-lines notmuch-command "count" search-args)) "0")
- (setq search-args basic-query))
- (let ((proc (notmuch-start-notmuch
- "notmuch-tree" (current-buffer) #'notmuch-tree-process-sentinel
- "show" "--body=false" "--format=sexp"
- message-arg search-args))
- ;; Use a scratch buffer to accumulate partial output.
- ;; This buffer will be killed by the sentinel, which
- ;; should be called no matter how the process dies.
- (parse-buf (generate-new-buffer " *notmuch tree parse*")))
- (process-put proc 'parse-buf parse-buf)
- (set-process-filter proc 'notmuch-tree-process-filter)
- (set-process-query-on-exit-flag proc nil))))
-
-(defun notmuch-tree (&optional query query-context target buffer-name open-target)
- "Display threads matching QUERY in Tree View.
-
-The arguments are:
- QUERY: the main query. This can be any query but in many cases will be
- a single thread. If nil this is read interactively from the minibuffer.
- QUERY-CONTEXT: is an additional term for the query. The query used
- is QUERY and QUERY-CONTEXT unless that does not match any messages
- in which case we fall back to just QUERY.
- TARGET: A message ID (with the id: prefix) that will be made
- current if it appears in the tree view results.
- BUFFER-NAME: the name of the buffer to display the tree view. If
- it is nil \"*notmuch-tree\" followed by QUERY is used.
- OPEN-TARGET: If TRUE open the target message in the message pane."
- (interactive)
- (if (null query)
- (setq query (notmuch-read-query "Notmuch tree view search: ")))
- (let ((buffer (get-buffer-create (generate-new-buffer-name
- (or buffer-name
- (concat "*notmuch-tree-" query "*")))))
- (inhibit-read-only t))
-
- (switch-to-buffer buffer))
- ;; Don't track undo information for this buffer
- (set 'buffer-undo-list t)
-
- (notmuch-tree-worker query query-context target open-target)
-
- (setq truncate-lines t))
-
-
-;; Set up key bindings from the rest of notmuch.
-(define-key notmuch-common-keymap "z" 'notmuch-tree)
-(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query)
-(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
-(message "Initialised notmuch-tree")
-
-(provide 'notmuch-tree)
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
new file mode 100644
index 0000000..d3330a0
--- /dev/null
+++ b/emacs/notmuch-tree.el
@@ -0,0 +1,946 @@
+;; notmuch-tree.el --- displaying notmuch forests.
+;;
+;; Copyright © Carl Worth
+;; Copyright © David Edmondson
+;; Copyright © Mark Walters
+;;
+;; This file is part of Notmuch.
+;;
+;; Notmuch is free software: you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Notmuch is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Notmuch. If not, see <http://www.gnu.org/licenses/>.
+;;
+;; Authors: David Edmondson <dme@dme.org>
+;; Mark Walters <markwalters1009@gmail.com>
+
+(require 'mail-parse)
+
+(require 'notmuch-lib)
+(require 'notmuch-query)
+(require 'notmuch-show)
+(require 'notmuch-tag)
+(require 'notmuch-parser)
+(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here
+
+(eval-when-compile (require 'cl))
+(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line))
+(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
+(declare-function notmuch-read-query "notmuch" (prompt))
+(declare-function notmuch-search-find-thread-id "notmuch" (&optional bare))
+(declare-function notmuch-search-find-subject "notmuch" ())
+
+;; the following variable is defined in notmuch.el
+(defvar notmuch-search-query-string)
+
+(defgroup notmuch-tree nil
+ "Showing message and thread structure."
+ :group 'notmuch)
+
+(defcustom notmuch-tree-show-out nil
+ "View selected messages in new window rather than split-pane."
+ :type 'boolean
+ :group 'notmuch-tree)
+
+(defcustom notmuch-tree-result-format
+ `(("date" . "%12s ")
+ ("authors" . "%-20s")
+ ((("tree" . "%s")("subject" . "%s")) ." %-54s ")
+ ("tags" . "(%s)"))
+ "Result formatting for Tree view. Supported fields are: date,
+ authors, subject, tree, tags. Tree means the thread tree
+ box graphics. The field may also be a list in which case
+ the formatting rules are applied recursively and then the
+ output of all the fields in the list is inserted
+ according to format-string.
+
+Note the author string should not contain
+ whitespace (put it in the neighbouring fields instead).
+ For example:
+ (setq notmuch-tree-result-format \(\(\"authors\" . \"%-40s\"\)
+ \(\"subject\" . \"%s\"\)\)\)"
+ :type '(alist :key-type (string) :value-type (string))
+ :group 'notmuch-tree)
+
+;; Faces for messages that match the query.
+(defface notmuch-tree-match-date-face
+ '((t :inherit default))
+ "Face used in tree mode for the date in messages matching the query."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-match-author-face
+ '((((class color)
+ (background dark))
+ (:foreground "OliveDrab1"))
+ (((class color)
+ (background light))
+ (:foreground "dark blue"))
+ (t
+ (:bold t)))
+ "Face used in tree mode for the date in messages matching the query."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-match-subject-face
+ '((t :inherit default))
+ "Face used in tree mode for the subject in messages matching the query."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-match-tree-face
+ '((t :inherit default))
+ "Face used in tree mode for the thread tree block graphics in messages matching the query."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-match-tag-face
+ '((((class color)
+ (background dark))
+ (:foreground "OliveDrab1"))
+ (((class color)
+ (background light))
+ (:foreground "navy blue" :bold t))
+ (t
+ (:bold t)))
+ "Face used in tree mode for tags in messages matching the query."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+;; Faces for messages that do not match the query.
+(defface notmuch-tree-no-match-date-face
+ '((t (:foreground "gray")))
+ "Face used in tree mode for non-matching dates."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-no-match-subject-face
+ '((t (:foreground "gray")))
+ "Face used in tree mode for non-matching subjects."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-no-match-tree-face
+ '((t (:foreground "gray")))
+ "Face used in tree mode for the thread tree block graphics in messages matching the query."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-no-match-author-face
+ '((t (:foreground "gray")))
+ "Face used in tree mode for the date in messages matching the query."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defface notmuch-tree-no-match-tag-face
+ '((t (:foreground "gray")))
+ "Face used in tree mode face for non-matching tags."
+ :group 'notmuch-tree
+ :group 'notmuch-faces)
+
+(defvar notmuch-tree-previous-subject
+ "The subject of the most recent result shown during the async display")
+(make-variable-buffer-local 'notmuch-tree-previous-subject)
+
+(defvar notmuch-tree-basic-query nil
+ "A buffer local copy of argument query to the function notmuch-tree")
+(make-variable-buffer-local 'notmuch-tree-basic-query)
+
+(defvar notmuch-tree-query-context nil
+ "A buffer local copy of argument query-context to the function notmuch-tree")
+(make-variable-buffer-local 'notmuch-tree-query-context)
+
+(defvar notmuch-tree-target-msg nil
+ "A buffer local copy of argument target to the function notmuch-tree")
+(make-variable-buffer-local 'notmuch-tree-target-msg)
+
+(defvar notmuch-tree-open-target nil
+ "A buffer local copy of argument open-target to the function notmuch-tree")
+(make-variable-buffer-local 'notmuch-tree-open-target)
+
+(defvar notmuch-tree-message-window nil
+ "The window of the message pane.
+
+It is set in both the tree buffer and the child show buffer. It
+is used to try and close the message pane when quitting tree view
+or the child show buffer.")
+(make-variable-buffer-local 'notmuch-tree-message-window)
+(put 'notmuch-tree-message-window 'permanent-local t)
+
+(defvar notmuch-tree-message-buffer nil
+ "The buffer name of the show buffer in the message pane.
+
+This is used to try and make sure we don't close the message pane
+if the user has loaded a different buffer in that window.")
+(make-variable-buffer-local 'notmuch-tree-message-buffer)
+(put 'notmuch-tree-message-buffer 'permanent-local t)
+
+(defun notmuch-tree-to-message-pane (func)
+ "Execute FUNC in message pane.
+
+This function returns a function (so can be used as a keybinding)
+which executes function FUNC in the message pane if it is
+open (if the message pane is closed it does nothing)."
+ `(lambda ()
+ ,(concat "(In message pane) " (documentation func t))
+ (interactive)
+ (when (window-live-p notmuch-tree-message-window)
+ (with-selected-window notmuch-tree-message-window
+ (call-interactively #',func)))))
+
+(defun notmuch-tree-button-activate (&optional button)
+ "Activate BUTTON or button at point
+
+This function does not give an error if there is no button."
+ (interactive)
+ (let ((button (or button (button-at (point)))))
+ (when button (button-activate button))))
+
+(defun notmuch-tree-close-message-pane-and (func)
+ "Close message pane and execute FUNC.
+
+This function returns a function (so can be used as a keybinding)
+which closes the message pane if open and then executes function
+FUNC."
+ `(lambda ()
+ ,(concat "(Close message pane and) " (documentation func t))
+ (interactive)
+ (notmuch-tree-close-message-window)
+ (call-interactively #',func)))
+
+(defvar notmuch-tree-mode-map
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map notmuch-common-keymap)
+ ;; The following override the global keymap.
+ ;; Override because we want to close message pane first.
+ (define-key map "?" (notmuch-tree-close-message-pane-and #'notmuch-help))
+ ;; Override because we first close message pane and then close tree buffer.
+ (define-key map "q" 'notmuch-tree-quit)
+ ;; Override because we close message pane after the search query is entered.
+ (define-key map "s" 'notmuch-tree-to-search)
+ ;; Override because we want to close message pane first.
+ (define-key map "m" (notmuch-tree-close-message-pane-and #'notmuch-mua-new-mail))
+
+ ;; these use notmuch-show functions directly
+ (define-key map "|" 'notmuch-show-pipe-message)
+ (define-key map "w" 'notmuch-show-save-attachments)
+ (define-key map "v" 'notmuch-show-view-all-mime-parts)
+ (define-key map "c" 'notmuch-show-stash-map)
+
+ ;; these apply to the message pane
+ (define-key map (kbd "M-TAB") (notmuch-tree-to-message-pane #'notmuch-show-previous-button))
+ (define-key map (kbd "<backtab>") (notmuch-tree-to-message-pane #'notmuch-show-previous-button))
+ (define-key map (kbd "TAB") (notmuch-tree-to-message-pane #'notmuch-show-next-button))
+ (define-key map "e" (notmuch-tree-to-message-pane #'notmuch-tree-button-activate))
+
+ ;; bindings from show (or elsewhere) but we close the message pane first.
+ (define-key map "f" (notmuch-tree-close-message-pane-and #'notmuch-show-forward-message))
+ (define-key map "r" (notmuch-tree-close-message-pane-and #'notmuch-show-reply-sender))
+ (define-key map "R" (notmuch-tree-close-message-pane-and #'notmuch-show-reply))
+ (define-key map "V" (notmuch-tree-close-message-pane-and #'notmuch-show-view-raw-message))
+
+ ;; The main tree view bindings
+ (define-key map (kbd "RET") 'notmuch-tree-show-message)
+ (define-key map [mouse-1] 'notmuch-tree-show-message)
+ (define-key map "x" 'notmuch-tree-quit)
+ (define-key map "A" 'notmuch-tree-archive-thread)
+ (define-key map "a" 'notmuch-tree-archive-message-then-next)
+ (define-key map "=" 'notmuch-tree-refresh-view)
+ (define-key map "z" 'notmuch-tree-to-tree)
+ (define-key map "n" 'notmuch-tree-next-matching-message)
+ (define-key map "p" 'notmuch-tree-prev-matching-message)
+ (define-key map "N" 'notmuch-tree-next-message)
+ (define-key map "P" 'notmuch-tree-prev-message)
+ (define-key map (kbd "M-p") 'notmuch-tree-prev-thread)
+ (define-key map (kbd "M-n") 'notmuch-tree-next-thread)
+ (define-key map "-" 'notmuch-tree-remove-tag)
+ (define-key map "+" 'notmuch-tree-add-tag)
+ (define-key map "*" 'notmuch-tree-tag-thread)
+ (define-key map " " 'notmuch-tree-scroll-or-next)
+ (define-key map "b" 'notmuch-tree-scroll-message-window-back)
+ map))
+(fset 'notmuch-tree-mode-map notmuch-tree-mode-map)
+
+(defun notmuch-tree-get-message-properties ()
+ "Return the properties of the current message as a plist.
+
+Some useful entries are:
+:headers - Property list containing the headers :Date, :Subject, :From, etc.
+:tags - Tags for this message"
+ (save-excursion
+ (beginning-of-line)
+ (get-text-property (point) :notmuch-message-properties)))
+
+;; XXX This should really be a lib function but we are trying to
+;; reduce impact on the code base.
+(defun notmuch-show-get-prop (prop &optional props)
+ "This is a tree view overridden version of notmuch-show-get-prop
+
+It gets property PROP from PROPS or, if PROPS is nil, the current
+message in either tree or show. This means that several functions
+in notmuch-show now work unchanged in tree as they just need the
+correct message properties."
+ (let ((props (or props
+ (cond ((eq major-mode 'notmuch-show-mode)
+ (notmuch-show-get-message-properties))
+ ((eq major-mode 'notmuch-tree-mode)
+ (notmuch-tree-get-message-properties))))))
+ (plist-get props prop)))
+
+(defun notmuch-tree-set-message-properties (props)
+ (save-excursion
+ (beginning-of-line)
+ (put-text-property (point) (+ (point) 1) :notmuch-message-properties props)))
+
+(defun notmuch-tree-set-prop (prop val &optional props)
+ (let ((inhibit-read-only t)
+ (props (or props
+ (notmuch-tree-get-message-properties))))
+ (plist-put props prop val)
+ (notmuch-tree-set-message-properties props)))
+
+(defun notmuch-tree-get-prop (prop &optional props)
+ (let ((props (or props
+ (notmuch-tree-get-message-properties))))
+ (plist-get props prop)))
+
+(defun notmuch-tree-set-tags (tags)
+ "Set the tags of the current message."
+ (notmuch-tree-set-prop :tags tags))
+
+(defun notmuch-tree-get-tags ()
+ "Return the tags of the current message."
+ (notmuch-tree-get-prop :tags))
+
+(defun notmuch-tree-get-message-id ()
+ "Return the message id of the current message."
+ (let ((id (notmuch-tree-get-prop :id)))
+ (if id
+ (notmuch-id-to-query id)
+ nil)))
+
+(defun notmuch-tree-get-match ()
+ "Return whether the current message is a match."
+ (interactive)
+ (notmuch-tree-get-prop :match))
+
+(defun notmuch-tree-refresh-result ()
+ "Redisplay the current message line.
+
+This redisplays the current line based on the messages
+properties (as they are now). This is used when tags are
+updated."
+ (let ((init-point (point))
+ (end (line-end-position))
+ (msg (notmuch-tree-get-message-properties))
+ (inhibit-read-only t))
+ (beginning-of-line)
+ ;; This is a little tricky: we override
+ ;; notmuch-tree-previous-subject to get the decision between
+ ;; ... and a subject right and it stops notmuch-tree-insert-msg
+ ;; from overwriting the buffer local copy of
+ ;; notmuch-tree-previous-subject if this is called while the
+ ;; buffer is displaying.
+ (let ((notmuch-tree-previous-subject (notmuch-tree-get-prop :previous-subject)))
+ (delete-region (point) (1+ (line-end-position)))
+ (notmuch-tree-insert-msg msg))
+ (let ((new-end (line-end-position)))
+ (goto-char (if (= init-point end)
+ new-end
+ (min init-point (- new-end 1)))))))
+
+(defun notmuch-tree-tag-update-display (&optional tag-changes)
+ "Update display for TAG-CHANGES to current message.
+
+Does NOT change the database."
+ (let* ((current-tags (notmuch-tree-get-tags))
+ (new-tags (notmuch-update-tags current-tags tag-changes)))
+ (unless (equal current-tags new-tags)
+ (notmuch-tree-set-tags new-tags)
+ (notmuch-tree-refresh-result))))
+
+(defun notmuch-tree-tag (tag-changes)
+ "Change tags for the current message"
+ (interactive
+ (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message")))
+ (notmuch-tag (notmuch-tree-get-message-id) tag-changes)
+ (notmuch-tree-tag-update-display tag-changes))
+
+(defun notmuch-tree-add-tag (tag-changes)
+ "Same as `notmuch-tree-tag' but sets initial input to '+'."
+ (interactive
+ (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "+")))
+ (notmuch-tree-tag tag-changes))
+
+(defun notmuch-tree-remove-tag (tag-changes)
+ "Same as `notmuch-tree-tag' but sets initial input to '-'."
+ (interactive
+ (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "-")))
+ (notmuch-tree-tag tag-changes))
+
+;; The next two functions close the message window before calling
+;; notmuch-search or notmuch-tree but they do so after the user has
+;; entered the query (in case the user was basing the query on
+;; something in the message window).
+
+(defun notmuch-tree-to-search ()
+ "Run \"notmuch search\" with the given `query' and display results."
+ (interactive)
+ (let ((query (notmuch-read-query "Notmuch search: ")))
+ (notmuch-tree-close-message-window)
+ (notmuch-search query)))
+
+(defun notmuch-tree-to-tree ()
+ "Run a query and display results in Tree view"
+ (interactive)
+ (let ((query (notmuch-read-query "Notmuch tree view search: ")))
+ (notmuch-tree-close-message-window)
+ (notmuch-tree query)))
+
+;; This function should be in notmuch-show.el but be we trying to
+;; minimise impact on the rest of the codebase.
+(defun notmuch-tree-from-show-current-query ()
+ "Call notmuch tree with the current query"
+ (interactive)
+ (notmuch-tree notmuch-show-thread-id
+ notmuch-show-query-context
+ (notmuch-show-get-message-id)))
+
+;; This function should be in notmuch.el but be we trying to minimise
+;; impact on the rest of the codebase.
+(defun notmuch-tree-from-search-current-query ()
+ "Call notmuch tree with the current query"
+ (interactive)
+ (notmuch-tree notmuch-search-query-string))
+
+;; This function should be in notmuch.el but be we trying to minimise
+;; impact on the rest of the codebase.
+(defun notmuch-tree-from-search-thread ()
+ "Show the selected thread with notmuch-tree"
+ (interactive)
+ (notmuch-tree (notmuch-search-find-thread-id)
+ notmuch-search-query-string
+ nil
+ (notmuch-prettify-subject (notmuch-search-find-subject))
+ t))
+
+(defun notmuch-tree-message-window-kill-hook ()
+ "Close the message pane when exiting the show buffer."
+ (let ((buffer (current-buffer)))
+ (when (and (window-live-p notmuch-tree-message-window)
+ (eq (window-buffer notmuch-tree-message-window) buffer))
+ ;; We do not want an error if this is the sole window in the
+ ;; frame and I do not know how to test for that in emacs pre
+ ;; 24. Hence we just ignore-errors.
+ (ignore-errors
+ (delete-window notmuch-tree-message-window)))))
+
+(defun notmuch-tree-show-message-in ()
+ "Show the current message (in split-pane)."
+ (interactive)
+ (let ((id (notmuch-tree-get-message-id))
+ (inhibit-read-only t)
+ buffer)
+ (when id
+ ;; We close and reopen the window to kill off un-needed buffers
+ ;; this might cause flickering but seems ok.
+ (notmuch-tree-close-message-window)
+ (setq notmuch-tree-message-window
+ (split-window-vertically (/ (window-height) 4)))
+ (with-selected-window notmuch-tree-message-window
+ ;; Since we are only displaying one message do not indent.
+ (let ((notmuch-show-indent-messages-width 0)
+ (notmuch-show-only-matching-messages t))
+ (setq buffer (notmuch-show id))))
+ ;; We need the `let' as notmuch-tree-message-window is buffer local.
+ (let ((window notmuch-tree-message-window))
+ (with-current-buffer buffer
+ (setq notmuch-tree-message-window window)
+ (add-hook 'kill-buffer-hook 'notmuch-tree-message-window-kill-hook)))
+ (when notmuch-show-mark-read-tags
+ (notmuch-tree-tag-update-display notmuch-show-mark-read-tags))
+ (setq notmuch-tree-message-buffer buffer))))
+
+(defun notmuch-tree-show-message-out ()
+ "Show the current message (in whole window)."
+ (interactive)
+ (let ((id (notmuch-tree-get-message-id))
+ (inhibit-read-only t)
+ buffer)
+ (when id
+ ;; We close the window to kill off un-needed buffers.
+ (notmuch-tree-close-message-window)
+ (notmuch-show id))))
+
+(defun notmuch-tree-show-message (arg)
+ "Show the current message.
+
+Shows in split pane or whole window according to value of
+`notmuch-tree-show-out'. A prefix argument reverses the choice."
+ (interactive "P")
+ (if (or (and notmuch-tree-show-out (not arg))
+ (and (not notmuch-tree-show-out) arg))
+ (notmuch-tree-show-message-out)
+ (notmuch-tree-show-message-in)))
+
+(defun notmuch-tree-scroll-message-window ()
+ "Scroll the message window (if it exists)"
+ (interactive)
+ (when (window-live-p notmuch-tree-message-window)
+ (with-selected-window notmuch-tree-message-window
+ (if (pos-visible-in-window-p (point-max))
+ t
+ (scroll-up)))))
+
+(defun notmuch-tree-scroll-message-window-back ()
+ "Scroll the message window back(if it exists)"
+ (interactive)
+ (when (window-live-p notmuch-tree-message-window)
+ (with-selected-window notmuch-tree-message-window
+ (if (pos-visible-in-window-p (point-min))
+ t
+ (scroll-down)))))
+
+(defun notmuch-tree-scroll-or-next ()
+ "Scroll the message window. If it at end go to next message."
+ (interactive)
+ (when (notmuch-tree-scroll-message-window)
+ (notmuch-tree-next-matching-message)))
+
+(defun notmuch-tree-quit ()
+ "Close the split view or exit tree."
+ (interactive)
+ (unless (notmuch-tree-close-message-window)
+ (kill-buffer (current-buffer))))
+
+(defun notmuch-tree-close-message-window ()
+ "Close the message-window. Return t if close succeeds."
+ (interactive)
+ (when (and (window-live-p notmuch-tree-message-window)
+ (eq (window-buffer notmuch-tree-message-window) notmuch-tree-message-buffer))
+ (delete-window notmuch-tree-message-window)
+ (unless (get-buffer-window-list notmuch-tree-message-buffer)
+ (kill-buffer notmuch-tree-message-buffer))
+ t))
+
+(defun notmuch-tree-archive-message (&optional unarchive)
+ "Archive the current message.
+
+Archive the current message by applying the tag changes in
+`notmuch-archive-tags' to it. If a prefix argument is given, the
+message will be \"unarchived\", i.e. the tag changes in
+`notmuch-archive-tags' will be reversed."
+ (interactive "P")
+ (when notmuch-archive-tags
+ (notmuch-tree-tag (notmuch-tag-change-list notmuch-archive-tags unarchive))))
+
+(defun notmuch-tree-archive-message-then-next (&optional unarchive)
+ "Archive the current message and move to next matching message."
+ (interactive "P")
+ (notmuch-tree-archive-message unarchive)
+ (notmuch-tree-next-matching-message))
+
+(defun notmuch-tree-next-message ()
+ "Move to next message."
+ (interactive)
+ (forward-line)
+ (when (window-live-p notmuch-tree-message-window)
+ (notmuch-tree-show-message-in)))
+
+(defun notmuch-tree-prev-message ()
+ "Move to previous message."
+ (interactive)
+ (forward-line -1)
+ (when (window-live-p notmuch-tree-message-window)
+ (notmuch-tree-show-message-in)))
+
+(defun notmuch-tree-prev-matching-message ()
+ "Move to previous matching message."
+ (interactive)
+ (forward-line -1)
+ (while (and (not (bobp)) (not (notmuch-tree-get-match)))
+ (forward-line -1))
+ (when (window-live-p notmuch-tree-message-window)
+ (notmuch-tree-show-message-in)))
+
+(defun notmuch-tree-next-matching-message ()
+ "Move to next matching message."
+ (interactive)
+ (forward-line)
+ (while (and (not (eobp)) (not (notmuch-tree-get-match)))
+ (forward-line))
+ (when (window-live-p notmuch-tree-message-window)
+ (notmuch-tree-show-message-in)))
+
+(defun notmuch-tree-refresh-view ()
+ "Refresh view."
+ (interactive)
+ (let ((inhibit-read-only t)
+ (basic-query notmuch-tree-basic-query)
+ (query-context notmuch-tree-query-context)
+ (target (notmuch-tree-get-message-id)))
+ (erase-buffer)
+ (notmuch-tree-worker basic-query
+ query-context
+ target)))
+
+(defun notmuch-tree-thread-top ()
+ (when (notmuch-tree-get-message-properties)
+ (while (not (or (notmuch-tree-get-prop :first) (eobp)))
+ (forward-line -1))))
+
+(defun notmuch-tree-prev-thread ()
+ (interactive)
+ (forward-line -1)
+ (notmuch-tree-thread-top))
+
+(defun notmuch-tree-next-thread ()
+ (interactive)
+ (forward-line 1)
+ (while (not (or (notmuch-tree-get-prop :first) (eobp)))
+ (forward-line 1)))
+
+(defun notmuch-tree-thread-mapcar (function)
+ "Iterate through all messages in the current thread
+ and call FUNCTION for side effects."
+ (save-excursion
+ (notmuch-tree-thread-top)
+ (loop collect (funcall function)
+ do (forward-line)
+ while (and (notmuch-tree-get-message-properties)
+ (not (notmuch-tree-get-prop :first))))))
+
+(defun notmuch-tree-get-messages-ids-thread-search ()
+ "Return a search string for all message ids of messages in the current thread."
+ (mapconcat 'identity
+ (notmuch-tree-thread-mapcar 'notmuch-tree-get-message-id)
+ " or "))
+
+(defun notmuch-tree-tag-thread (tag-changes)
+ "Tag all messages in the current thread"
+ (interactive
+ (let ((tags (apply #'append (notmuch-tree-thread-mapcar
+ (lambda () (notmuch-tree-get-tags))))))
+ (list (notmuch-read-tag-changes tags "Tag thread"))))
+ (when (notmuch-tree-get-message-properties)
+ (notmuch-tag (notmuch-tree-get-messages-ids-thread-search) tag-changes)
+ (notmuch-tree-thread-mapcar
+ (lambda () (notmuch-tree-tag-update-display tag-changes)))))
+
+(defun notmuch-tree-archive-thread (&optional unarchive)
+ "Archive each message in thread.
+
+Archive each message currently shown by applying the tag changes
+in `notmuch-archive-tags' to each. If a prefix argument is given,
+the messages will be \"unarchived\", i.e. the tag changes in
+`notmuch-archive-tags' will be reversed.
+
+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."
+ (interactive "P")
+ (when notmuch-archive-tags
+ (notmuch-tree-tag-thread
+ (notmuch-tag-change-list notmuch-archive-tags unarchive))))
+
+;; Functions below here display the tree buffer itself.
+
+(defun notmuch-tree-clean-address (address)
+ "Try to clean a single email ADDRESS for display. Return
+AUTHOR_NAME if present, otherwise return AUTHOR_EMAIL. Return
+unchanged ADDRESS if parsing fails."
+ (let* ((clean-address (notmuch-clean-address address))
+ (p-address (car clean-address))
+ (p-name (cdr clean-address)))
+
+ ;; If we have a name return that otherwise return the address.
+ (or p-name p-address)))
+
+(defun notmuch-tree-format-field (field format-string msg)
+ "Format a FIELD of MSG according to FORMAT-STRING and return string"
+ (let* ((headers (plist-get msg :headers))
+ (match (plist-get msg :match)))
+ (cond
+ ((listp field)
+ (format format-string (notmuch-tree-format-field-list field msg)))
+
+ ((string-equal field "date")
+ (let ((face (if match
+ 'notmuch-tree-match-date-face
+ 'notmuch-tree-no-match-date-face)))
+ (propertize (format format-string (plist-get msg :date_relative)) 'face face)))
+
+ ((string-equal field "tree")
+ (let ((tree-status (plist-get msg :tree-status))
+ (face (if match
+ 'notmuch-tree-match-tree-face
+ 'notmuch-tree-no-match-tree-face)))
+
+ (propertize (format format-string
+ (mapconcat #'identity (reverse tree-status) ""))
+ 'face face)))
+
+ ((string-equal field "subject")
+ (let ((bare-subject (notmuch-show-strip-re (plist-get headers :Subject)))
+ (previous-subject notmuch-tree-previous-subject)
+ (face (if match
+ 'notmuch-tree-match-subject-face
+ 'notmuch-tree-no-match-subject-face)))
+
+ (setq notmuch-tree-previous-subject bare-subject)
+ (propertize (format format-string
+ (if (string= previous-subject bare-subject)
+ " ..."
+ bare-subject))
+ 'face face)))
+
+ ((string-equal field "authors")
+ (let ((author (notmuch-tree-clean-address (plist-get headers :From)))
+ (len (length (format format-string "")))
+ (face (if match
+ 'notmuch-tree-match-author-face
+ 'notmuch-tree-no-match-author-face)))
+ (when (> (length author) len)
+ (setq author (substring author 0 len)))
+ (propertize (format format-string author) 'face face)))
+
+ ((string-equal field "tags")
+ (let ((tags (plist-get msg :tags))
+ (face (if match
+ 'notmuch-tree-match-tag-face
+ 'notmuch-tree-no-match-tag-face)))
+ (propertize (format format-string
+ (mapconcat #'identity tags ", "))
+ 'face face))))))
+
+
+(defun notmuch-tree-format-field-list (field-list msg)
+ "Format fields of MSG according to FIELD-LIST and return string"
+ (let (result-string)
+ (dolist (spec field-list result-string)
+ (let ((field-string (notmuch-tree-format-field (car spec) (cdr spec) msg)))
+ (setq result-string (concat result-string field-string))))))
+
+(defun notmuch-tree-insert-msg (msg)
+ "Insert the message MSG according to notmuch-tree-result-format"
+ ;; We need to save the previous subject as it will get overwritten
+ ;; by the insert-field calls.
+ (let ((previous-subject notmuch-tree-previous-subject))
+ (insert (notmuch-tree-format-field-list notmuch-tree-result-format msg))
+ (notmuch-tree-set-message-properties msg)
+ (notmuch-tree-set-prop :previous-subject previous-subject)
+ (insert "\n")))
+
+(defun notmuch-tree-goto-and-insert-msg (msg)
+ "Insert msg at the end of the buffer. Move point to msg if it is the target"
+ (save-excursion
+ (goto-char (point-max))
+ (notmuch-tree-insert-msg msg))
+ (let ((msg-id (notmuch-id-to-query (plist-get msg :id)))
+ (target notmuch-tree-target-msg))
+ (when (or (and (not target) (plist-get msg :match))
+ (string= msg-id target))
+ (setq notmuch-tree-target-msg "found")
+ (goto-char (point-max))
+ (forward-line -1)
+ (when notmuch-tree-open-target
+ (notmuch-tree-show-message-in)))))
+
+(defun notmuch-tree-insert-tree (tree depth tree-status first last)
+ "Insert the message tree TREE at depth DEPTH in the current thread.
+
+A message tree is another name for a single sub-thread: i.e., a
+message together with all its descendents."
+ (let ((msg (car tree))
+ (replies (cadr tree)))
+
+ (cond
+ ((and (< 0 depth) (not last))
+ (push "├" tree-status))
+ ((and (< 0 depth) last)
+ (push "╰" tree-status))
+ ((and (eq 0 depth) first last)
+;; (push "─" tree-status)) choice between this and next line is matter of taste.
+ (push " " tree-status))
+ ((and (eq 0 depth) first (not last))
+ (push "┬" tree-status))
+ ((and (eq 0 depth) (not first) last)
+ (push "╰" tree-status))
+ ((and (eq 0 depth) (not first) (not last))
+ (push "├" tree-status)))
+
+ (push (concat (if replies "┬" "─") "►") tree-status)
+ (plist-put msg :first (and first (eq 0 depth)))
+ (notmuch-tree-goto-and-insert-msg (plist-put msg :tree-status tree-status))
+ (pop tree-status)
+ (pop tree-status)
+
+ (if last
+ (push " " tree-status)
+ (push "│" tree-status))
+
+ (notmuch-tree-insert-thread replies (1+ depth) tree-status)))
+
+(defun notmuch-tree-insert-thread (thread depth tree-status)
+ "Insert the collection of sibling sub-threads THREAD at depth DEPTH in the current forest."
+ (let ((n (length thread)))
+ (loop for tree in thread
+ for count from 1 to n
+
+ do (notmuch-tree-insert-tree tree depth tree-status (eq count 1) (eq count n)))))
+
+(defun notmuch-tree-insert-forest-thread (forest-thread)
+ "Insert a single complete thread."
+ (let (tree-status)
+ ;; Reset at the start of each main thread.
+ (setq notmuch-tree-previous-subject nil)
+ (notmuch-tree-insert-thread forest-thread 0 tree-status)))
+
+(defun notmuch-tree-insert-forest (forest)
+ "Insert a forest of threads.
+
+This function inserts a collection of several complete threads as
+passed to it by notmuch-tree-process-filter."
+ (mapc 'notmuch-tree-insert-forest-thread forest))
+
+(defun notmuch-tree-mode ()
+ "Major mode displaying messages (as opposed to threads) of of a notmuch search.
+
+This buffer contains the results of a \"notmuch tree\" of your
+email archives. Each line in the buffer represents a single
+message giving the relative date, the author, subject, and any
+tags.
+
+Pressing \\[notmuch-tree-show-message] on any line displays that message.
+
+Complete list of currently available key bindings:
+
+\\{notmuch-tree-mode-map}"
+
+ (interactive)
+ (kill-all-local-variables)
+ (setq notmuch-buffer-refresh-function #'notmuch-tree-refresh-view)
+ (use-local-map notmuch-tree-mode-map)
+ (setq major-mode 'notmuch-tree-mode
+ mode-name "notmuch-tree")
+ (hl-line-mode 1)
+ (setq buffer-read-only t
+ truncate-lines t))
+
+(defun notmuch-tree-process-sentinel (proc msg)
+ "Add a message to let user know when \"notmuch tree\" exits"
+ (let ((buffer (process-buffer proc))
+ (status (process-status proc))
+ (exit-status (process-exit-status proc))
+ (never-found-target-thread nil))
+ (when (memq status '(exit signal))
+ (kill-buffer (process-get proc 'parse-buf))
+ (if (buffer-live-p buffer)
+ (with-current-buffer buffer
+ (save-excursion
+ (let ((inhibit-read-only t)
+ (atbob (bobp)))
+ (goto-char (point-max))
+ (if (eq status 'signal)
+ (insert "Incomplete search results (tree view process was killed).\n"))
+ (when (eq status 'exit)
+ (insert "End of search results.")
+ (unless (= exit-status 0)
+ (insert (format " (process returned %d)" exit-status)))
+ (insert "\n")))))))))
+
+(defun notmuch-tree-process-filter (proc string)
+ "Process and filter the output of \"notmuch show\" for tree view"
+ (let ((results-buf (process-buffer proc))
+ (parse-buf (process-get proc 'parse-buf))
+ (inhibit-read-only t)
+ done)
+ (if (not (buffer-live-p results-buf))
+ (delete-process proc)
+ (with-current-buffer parse-buf
+ ;; Insert new data
+ (save-excursion
+ (goto-char (point-max))
+ (insert string))
+ (notmuch-sexp-parse-partial-list 'notmuch-tree-insert-forest-thread
+ results-buf)))))
+
+(defun notmuch-tree-worker (basic-query &optional query-context target open-target)
+ "Insert the tree view of the search in the current buffer.
+
+This is is a helper function for notmuch-tree. The arguments are
+the same as for the function notmuch-tree."
+ (interactive)
+ (notmuch-tree-mode)
+ (setq notmuch-tree-basic-query basic-query)
+ (setq notmuch-tree-query-context query-context)
+ (setq notmuch-tree-target-msg target)
+ (setq notmuch-tree-open-target open-target)
+
+ (erase-buffer)
+ (goto-char (point-min))
+ (let* ((search-args (concat basic-query
+ (if query-context (concat " and (" query-context ")"))
+ ))
+ (message-arg "--entire-thread"))
+ (if (equal (car (process-lines notmuch-command "count" search-args)) "0")
+ (setq search-args basic-query))
+ (let ((proc (notmuch-start-notmuch
+ "notmuch-tree" (current-buffer) #'notmuch-tree-process-sentinel
+ "show" "--body=false" "--format=sexp"
+ message-arg search-args))
+ ;; Use a scratch buffer to accumulate partial output.
+ ;; This buffer will be killed by the sentinel, which
+ ;; should be called no matter how the process dies.
+ (parse-buf (generate-new-buffer " *notmuch tree parse*")))
+ (process-put proc 'parse-buf parse-buf)
+ (set-process-filter proc 'notmuch-tree-process-filter)
+ (set-process-query-on-exit-flag proc nil))))
+
+(defun notmuch-tree (&optional query query-context target buffer-name open-target)
+ "Display threads matching QUERY in Tree View.
+
+The arguments are:
+ QUERY: the main query. This can be any query but in many cases will be
+ a single thread. If nil this is read interactively from the minibuffer.
+ QUERY-CONTEXT: is an additional term for the query. The query used
+ is QUERY and QUERY-CONTEXT unless that does not match any messages
+ in which case we fall back to just QUERY.
+ TARGET: A message ID (with the id: prefix) that will be made
+ current if it appears in the tree view results.
+ BUFFER-NAME: the name of the buffer to display the tree view. If
+ it is nil \"*notmuch-tree\" followed by QUERY is used.
+ OPEN-TARGET: If TRUE open the target message in the message pane."
+ (interactive)
+ (if (null query)
+ (setq query (notmuch-read-query "Notmuch tree view search: ")))
+ (let ((buffer (get-buffer-create (generate-new-buffer-name
+ (or buffer-name
+ (concat "*notmuch-tree-" query "*")))))
+ (inhibit-read-only t))
+
+ (switch-to-buffer buffer))
+ ;; Don't track undo information for this buffer
+ (set 'buffer-undo-list t)
+
+ (notmuch-tree-worker query query-context target open-target)
+
+ (setq truncate-lines t))
+
+
+;; Set up key bindings from the rest of notmuch.
+(define-key notmuch-common-keymap "z" 'notmuch-tree)
+(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query)
+(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
+(message "Initialised notmuch-tree")
+
+(provide 'notmuch-tree)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 04/11] emacs: add tree to the makefile
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (2 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 05/11] test: move emacs-tree test into mainline Mark Walters
` (9 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
---
emacs/Makefile.local | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/emacs/Makefile.local b/emacs/Makefile.local
index a910aff..92467a3 100644
--- a/emacs/Makefile.local
+++ b/emacs/Makefile.local
@@ -7,6 +7,7 @@ emacs_sources := \
$(dir)/notmuch.el \
$(dir)/notmuch-query.el \
$(dir)/notmuch-show.el \
+ $(dir)/notmuch-tree.el \
$(dir)/notmuch-wash.el \
$(dir)/notmuch-hello.el \
$(dir)/notmuch-mua.el \
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 05/11] test: move emacs-tree test into mainline
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (3 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 04/11] emacs: add tree to the makefile Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 06/11] emacs: tree: remove test for emacs from tree test Mark Walters
` (8 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
We move the emacs-tree test and associated files into the main test
directory and add the test to the list in notmuch-test.
---
contrib/notmuch-pick/test/emacs-tree | 210 --------------------
.../tree.expected-output/notmuch-tree-show-window | 40 ----
.../notmuch-tree-single-thread | 6 -
.../tree.expected-output/notmuch-tree-tag-inbox | 53 -----
.../notmuch-tree-tag-inbox-tagged | 53 -----
.../notmuch-tree-tag-inbox-thread-tagged | 53 -----
test/emacs-tree | 210 ++++++++++++++++++++
test/notmuch-test | 1 +
test/tree.expected-output/notmuch-tree-show-window | 40 ++++
.../notmuch-tree-single-thread | 6 +
test/tree.expected-output/notmuch-tree-tag-inbox | 53 +++++
.../notmuch-tree-tag-inbox-tagged | 53 +++++
.../notmuch-tree-tag-inbox-thread-tagged | 53 +++++
13 files changed, 416 insertions(+), 415 deletions(-)
delete mode 100755 contrib/notmuch-pick/test/emacs-tree
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
create mode 100755 test/emacs-tree
create mode 100644 test/tree.expected-output/notmuch-tree-show-window
create mode 100644 test/tree.expected-output/notmuch-tree-single-thread
create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox
create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged
create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
diff --git a/contrib/notmuch-pick/test/emacs-tree b/contrib/notmuch-pick/test/emacs-tree
deleted file mode 100755
index 05ce85d..0000000
--- a/contrib/notmuch-pick/test/emacs-tree
+++ /dev/null
@@ -1,210 +0,0 @@
-#!/usr/bin/env bash
-
-test_description="emacs tree view interface"
-. test-lib.sh
-
-EXPECTED=$TEST_DIRECTORY/tree.expected-output
-
-add_email_corpus
-test_begin_subtest "Do we have emacs"
-test_emacs '(insert "hello\n")
- (test-output)'
-cat <<EOF >EXPECTED
-hello
-EOF
-test_expect_equal_file OUTPUT EXPECTED
-
-test_begin_subtest "Basic notmuch-tree view in emacs"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
-
-test_begin_subtest "Refreshed notmuch-tree view in emacs"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- (notmuch-tree-refresh-view)
- (notmuch-test-wait)
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
-
-# In the following tag tests we make sure the display is updated
-# correctly and, in a separate test, that the database is updated
-# correctly.
-
-test_begin_subtest "Tag message in notmuch tree view (display)"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- (forward-line)
- (notmuch-tree-tag (list "+test_tag"))
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-tagged
-
-test_begin_subtest "Tag message in notmuch tree view (database)"
-output=$(notmuch search --output=messages 'tag:test_tag')
-test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr"
-
-test_begin_subtest "Untag message in notmuch tree view"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- (forward-line)
- (notmuch-tree-tag (list "-test_tag"))
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
-
-test_begin_subtest "Untag message in notmuch tree view (database)"
-output=$(notmuch search --output=messages 'tag:test_tag')
-test_expect_equal "$output" ""
-
-test_begin_subtest "Tag thread in notmuch tree view"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- ;; move to a sizable thread
- (forward-line 26)
- (notmuch-tree-tag-thread (list "+test_thread_tag"))
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-thread-tagged
-
-test_begin_subtest "Tag message in notmuch tree view (database)"
-output=$(notmuch search --output=messages 'tag:test_thread_tag')
-test_expect_equal "$output" \
-"id:87ocn0qh6d.fsf@yoom.home.cworth.org
-id:20091118005040.GA25380@dottiness.seas.harvard.edu
-id:yunaayketfm.fsf@aiko.keithp.com
-id:87fx8can9z.fsf@vertex.dottedmag
-id:20091117203301.GV3165@dottiness.seas.harvard.edu
-id:87iqd9rn3l.fsf@vertex.dottedmag
-id:20091117190054.GU3165@dottiness.seas.harvard.edu"
-
-test_begin_subtest "Untag thread in notmuch tree view"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- ;; move to the same sizable thread as above
- (forward-line 26)
- (notmuch-tree-tag-thread (list "-test_thread_tag"))
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
-
-test_begin_subtest "Untag message in notmuch tree view (database)"
-output=$(notmuch search --output=messages 'tag:test_thread_tag')
-test_expect_equal "$output" ""
-
-test_begin_subtest "Navigation of notmuch-hello to search results"
-test_emacs '(notmuch-hello)
- (goto-char (point-min))
- (re-search-forward "inbox")
- (widget-button-press (1- (point)))
- (notmuch-test-wait)
- (notmuch-tree-from-search-current-query)
- (notmuch-test-wait)
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
-
-test_begin_subtest "Tree view of a single thread (from search)"
-test_emacs '(notmuch-hello)
- (goto-char (point-min))
- (re-search-forward "inbox")
- (widget-button-press (1- (point)))
- (notmuch-test-wait)
- (notmuch-tree-from-search-thread)
- (notmuch-test-wait)
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread
-
-test_begin_subtest "Tree view of a single thread (from show)"
-test_emacs '(notmuch-hello)
- (goto-char (point-min))
- (re-search-forward "inbox")
- (widget-button-press (1- (point)))
- (notmuch-test-wait)
- (notmuch-search-show-thread)
- (notmuch-tree-from-show-current-query)
- (notmuch-test-wait)
- (test-output)
- (delete-other-windows)'
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread
-
-test_begin_subtest "Message window of tree view"
-test_emacs '(notmuch-hello)
- (goto-char (point-min))
- (re-search-forward "inbox")
- (widget-button-press (1- (point)))
- (notmuch-test-wait)
- (notmuch-search-next-thread)
- (notmuch-tree-from-search-thread)
- (notmuch-test-wait)
- (select-window notmuch-tree-message-window)
- (test-output)
- (delete-other-windows)'
-cp OUTPUT /tmp/mjwout
-test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-show-window
-
-test_begin_subtest "Stash id"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "id:1258498485-sup-142@elly")
- (notmuch-test-wait)
- (notmuch-show-stash-message-id)')
-test_expect_equal "$output" "\"Stashed: id:1258498485-sup-142@elly\""
-
-test_begin_subtest "Move to next matching message"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "from:cworth")
- (notmuch-test-wait)
- (notmuch-tree-next-matching-message)
- (notmuch-show-stash-message-id)')
-test_expect_equal "$output" "\"Stashed: id:878we4qdqf.fsf@yoom.home.cworth.org\""
-
-test_begin_subtest "Move to next thread"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- (forward-line 26)
- (notmuch-tree-next-thread)
- (notmuch-show-stash-message-id)')
-test_expect_equal "$output" "\"Stashed: id:1258471718-6781-1-git-send-email-dottedmag@dottedmag.net\""
-
-test_begin_subtest "Move to previous thread"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- (forward-line 26)
- (notmuch-tree-prev-thread)
- (notmuch-show-stash-message-id)')
-test_expect_equal "$output" "\"Stashed: id:20091117190054.GU3165@dottiness.seas.harvard.edu\""
-
-test_begin_subtest "Move to previous previous thread"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
- (notmuch-tree "tag:inbox")
- (notmuch-test-wait)
- (forward-line 26)
- (notmuch-tree-prev-thread)
- (notmuch-tree-prev-thread)
- (notmuch-show-stash-message-id)')
-test_expect_equal "$output" "\"Stashed: id:1258493565-13508-1-git-send-email-keithp@keithp.com\""
-
-test_done
diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window
deleted file mode 100644
index e16792b..0000000
--- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window
+++ /dev/null
@@ -1,40 +0,0 @@
-Lars Kellogg-Stedman <lars@seas.harvard.edu> (2009-11-17) (inbox signed)
-Subject: [notmuch] Working with Maildir storage?
-To: notmuch@notmuchmail.org
-Date: Tue, 17 Nov 2009 14:00:54 -0500
-
-[ multipart/mixed ]
-[ multipart/signed ]
-[ text/plain ]
-I saw the LWN article and decided to take a look at notmuch. I'm
-currently using mutt and mairix to index and read a collection of
-Maildir mail folders (around 40,000 messages total).
-
-notmuch indexed the messages without complaint, but my attempt at
-searching bombed out. Running, for example:
-
- notmuch search storage
-
-Resulted in 4604 lines of errors along the lines of:
-
- Error opening
- /home/lars/Mail/read-messages.2008/cur/1246413773.24928_27334.hostname,U=3026:2,S:
- Too many open files
-
-I'm curious if this is expected behavior (i.e., notmuch does not work
-with Maildir) or if something else is going on.
-
-Cheers,
-
-[ 4-line signature. Click/Enter to show. ]
---
-Lars Kellogg-Stedman <lars@seas.harvard.edu>
-Senior Technologist, Computing and Information Technology
-Harvard University School of Engineering and Applied Sciences
-[ application/pgp-signature ]
-[ text/plain ]
-[ 4-line signature. Click/Enter to show. ]
-_______________________________________________
-notmuch mailing list
-notmuch@notmuchmail.org
-http://notmuchmail.org/mailman/listinfo/notmuch
diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread
deleted file mode 100644
index c9e5ef8..0000000
--- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread
+++ /dev/null
@@ -1,6 +0,0 @@
- 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox)
- 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
- 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
- 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
-End of search results.
diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox
deleted file mode 100644
index 484141e..0000000
--- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox
+++ /dev/null
@@ -1,53 +0,0 @@
- 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread)
- 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread)
- 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread)
- 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread)
- 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread)
- 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread)
- 2009-11-18 Keith Packard ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread)
- 2009-11-18 Keith Packard ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread)
- 2009-11-17 Jan Janak ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread)
- 2009-11-18 Keith Packard ╰┬► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
- 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
- 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread)
- 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread)
- 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread)
- 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread)
- 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread)
- 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
- 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
- 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
- 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
- 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread)
- 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread)
- 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread)
- 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread)
- 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread)
- 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread)
- 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread)
- 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread)
- 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread)
- 2009-11-17 Carl Worth ╰─► ... (inbox, unread)
-End of search results.
diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
deleted file mode 100644
index 1f75a34..0000000
--- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
+++ /dev/null
@@ -1,53 +0,0 @@
- 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread)
- 2010-12-16 Olivier Berger ─►Essai accentué (inbox, test_tag, unread)
- 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread)
- 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread)
- 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread)
- 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread)
- 2009-11-18 Keith Packard ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread)
- 2009-11-18 Keith Packard ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread)
- 2009-11-17 Jan Janak ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread)
- 2009-11-18 Keith Packard ╰┬► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
- 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
- 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread)
- 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread)
- 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread)
- 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread)
- 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread)
- 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
- 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
- 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
- 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
- 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread)
- 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread)
- 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread)
- 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread)
- 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread)
- 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread)
- 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread)
- 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread)
- 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread)
- 2009-11-17 Carl Worth ╰─► ... (inbox, unread)
-End of search results.
diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
deleted file mode 100644
index a7aba6e..0000000
--- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
+++ /dev/null
@@ -1,53 +0,0 @@
- 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread)
- 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread)
- 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread)
- 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread)
- 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread)
- 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread)
- 2009-11-18 Keith Packard ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread)
- 2009-11-18 Keith Packard ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread)
- 2009-11-17 Jan Janak ├─► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread)
- 2009-11-18 Keith Packard ╰┬► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
- 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
- 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, test_thread_tag, unread)
- 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, test_thread_tag, unread)
- 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, test_thread_tag, unread)
- 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, test_thread_tag, unread)
- 2009-11-17 Keith Packard │ ╰┬► ... (inbox, test_thread_tag, unread)
- 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, test_thread_tag, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, test_thread_tag, unread)
- 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
- 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
- 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
- 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
- 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
- 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
- 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread)
- 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread)
- 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread)
- 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread)
- 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread)
- 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread)
- 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread)
- 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread)
- 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread)
- 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread)
- 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread)
- 2009-11-17 Carl Worth ╰─► ... (inbox, unread)
-End of search results.
diff --git a/test/emacs-tree b/test/emacs-tree
new file mode 100755
index 0000000..05ce85d
--- /dev/null
+++ b/test/emacs-tree
@@ -0,0 +1,210 @@
+#!/usr/bin/env bash
+
+test_description="emacs tree view interface"
+. test-lib.sh
+
+EXPECTED=$TEST_DIRECTORY/tree.expected-output
+
+add_email_corpus
+test_begin_subtest "Do we have emacs"
+test_emacs '(insert "hello\n")
+ (test-output)'
+cat <<EOF >EXPECTED
+hello
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+test_begin_subtest "Basic notmuch-tree view in emacs"
+test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
+
+test_begin_subtest "Refreshed notmuch-tree view in emacs"
+test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ (notmuch-tree-refresh-view)
+ (notmuch-test-wait)
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
+
+# In the following tag tests we make sure the display is updated
+# correctly and, in a separate test, that the database is updated
+# correctly.
+
+test_begin_subtest "Tag message in notmuch tree view (display)"
+test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ (forward-line)
+ (notmuch-tree-tag (list "+test_tag"))
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-tagged
+
+test_begin_subtest "Tag message in notmuch tree view (database)"
+output=$(notmuch search --output=messages 'tag:test_tag')
+test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr"
+
+test_begin_subtest "Untag message in notmuch tree view"
+test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ (forward-line)
+ (notmuch-tree-tag (list "-test_tag"))
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
+
+test_begin_subtest "Untag message in notmuch tree view (database)"
+output=$(notmuch search --output=messages 'tag:test_tag')
+test_expect_equal "$output" ""
+
+test_begin_subtest "Tag thread in notmuch tree view"
+test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ ;; move to a sizable thread
+ (forward-line 26)
+ (notmuch-tree-tag-thread (list "+test_thread_tag"))
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-thread-tagged
+
+test_begin_subtest "Tag message in notmuch tree view (database)"
+output=$(notmuch search --output=messages 'tag:test_thread_tag')
+test_expect_equal "$output" \
+"id:87ocn0qh6d.fsf@yoom.home.cworth.org
+id:20091118005040.GA25380@dottiness.seas.harvard.edu
+id:yunaayketfm.fsf@aiko.keithp.com
+id:87fx8can9z.fsf@vertex.dottedmag
+id:20091117203301.GV3165@dottiness.seas.harvard.edu
+id:87iqd9rn3l.fsf@vertex.dottedmag
+id:20091117190054.GU3165@dottiness.seas.harvard.edu"
+
+test_begin_subtest "Untag thread in notmuch tree view"
+test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ ;; move to the same sizable thread as above
+ (forward-line 26)
+ (notmuch-tree-tag-thread (list "-test_thread_tag"))
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
+
+test_begin_subtest "Untag message in notmuch tree view (database)"
+output=$(notmuch search --output=messages 'tag:test_thread_tag')
+test_expect_equal "$output" ""
+
+test_begin_subtest "Navigation of notmuch-hello to search results"
+test_emacs '(notmuch-hello)
+ (goto-char (point-min))
+ (re-search-forward "inbox")
+ (widget-button-press (1- (point)))
+ (notmuch-test-wait)
+ (notmuch-tree-from-search-current-query)
+ (notmuch-test-wait)
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
+
+test_begin_subtest "Tree view of a single thread (from search)"
+test_emacs '(notmuch-hello)
+ (goto-char (point-min))
+ (re-search-forward "inbox")
+ (widget-button-press (1- (point)))
+ (notmuch-test-wait)
+ (notmuch-tree-from-search-thread)
+ (notmuch-test-wait)
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread
+
+test_begin_subtest "Tree view of a single thread (from show)"
+test_emacs '(notmuch-hello)
+ (goto-char (point-min))
+ (re-search-forward "inbox")
+ (widget-button-press (1- (point)))
+ (notmuch-test-wait)
+ (notmuch-search-show-thread)
+ (notmuch-tree-from-show-current-query)
+ (notmuch-test-wait)
+ (test-output)
+ (delete-other-windows)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread
+
+test_begin_subtest "Message window of tree view"
+test_emacs '(notmuch-hello)
+ (goto-char (point-min))
+ (re-search-forward "inbox")
+ (widget-button-press (1- (point)))
+ (notmuch-test-wait)
+ (notmuch-search-next-thread)
+ (notmuch-tree-from-search-thread)
+ (notmuch-test-wait)
+ (select-window notmuch-tree-message-window)
+ (test-output)
+ (delete-other-windows)'
+cp OUTPUT /tmp/mjwout
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-show-window
+
+test_begin_subtest "Stash id"
+output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "id:1258498485-sup-142@elly")
+ (notmuch-test-wait)
+ (notmuch-show-stash-message-id)')
+test_expect_equal "$output" "\"Stashed: id:1258498485-sup-142@elly\""
+
+test_begin_subtest "Move to next matching message"
+output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "from:cworth")
+ (notmuch-test-wait)
+ (notmuch-tree-next-matching-message)
+ (notmuch-show-stash-message-id)')
+test_expect_equal "$output" "\"Stashed: id:878we4qdqf.fsf@yoom.home.cworth.org\""
+
+test_begin_subtest "Move to next thread"
+output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ (forward-line 26)
+ (notmuch-tree-next-thread)
+ (notmuch-show-stash-message-id)')
+test_expect_equal "$output" "\"Stashed: id:1258471718-6781-1-git-send-email-dottedmag@dottedmag.net\""
+
+test_begin_subtest "Move to previous thread"
+output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ (forward-line 26)
+ (notmuch-tree-prev-thread)
+ (notmuch-show-stash-message-id)')
+test_expect_equal "$output" "\"Stashed: id:20091117190054.GU3165@dottiness.seas.harvard.edu\""
+
+test_begin_subtest "Move to previous previous thread"
+output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
+ (require (quote notmuch-tree))
+ (notmuch-tree "tag:inbox")
+ (notmuch-test-wait)
+ (forward-line 26)
+ (notmuch-tree-prev-thread)
+ (notmuch-tree-prev-thread)
+ (notmuch-show-stash-message-id)')
+test_expect_equal "$output" "\"Stashed: id:1258493565-13508-1-git-send-email-keithp@keithp.com\""
+
+test_done
diff --git a/test/notmuch-test b/test/notmuch-test
index aa28bb0..1db6e90 100755
--- a/test/notmuch-test
+++ b/test/notmuch-test
@@ -62,6 +62,7 @@ TESTS="
emacs-address-cleaning
emacs-hello
emacs-show
+ emacs-tree
missing-headers
hex-escaping
parse-time-string
diff --git a/test/tree.expected-output/notmuch-tree-show-window b/test/tree.expected-output/notmuch-tree-show-window
new file mode 100644
index 0000000..e16792b
--- /dev/null
+++ b/test/tree.expected-output/notmuch-tree-show-window
@@ -0,0 +1,40 @@
+Lars Kellogg-Stedman <lars@seas.harvard.edu> (2009-11-17) (inbox signed)
+Subject: [notmuch] Working with Maildir storage?
+To: notmuch@notmuchmail.org
+Date: Tue, 17 Nov 2009 14:00:54 -0500
+
+[ multipart/mixed ]
+[ multipart/signed ]
+[ text/plain ]
+I saw the LWN article and decided to take a look at notmuch. I'm
+currently using mutt and mairix to index and read a collection of
+Maildir mail folders (around 40,000 messages total).
+
+notmuch indexed the messages without complaint, but my attempt at
+searching bombed out. Running, for example:
+
+ notmuch search storage
+
+Resulted in 4604 lines of errors along the lines of:
+
+ Error opening
+ /home/lars/Mail/read-messages.2008/cur/1246413773.24928_27334.hostname,U=3026:2,S:
+ Too many open files
+
+I'm curious if this is expected behavior (i.e., notmuch does not work
+with Maildir) or if something else is going on.
+
+Cheers,
+
+[ 4-line signature. Click/Enter to show. ]
+--
+Lars Kellogg-Stedman <lars@seas.harvard.edu>
+Senior Technologist, Computing and Information Technology
+Harvard University School of Engineering and Applied Sciences
+[ application/pgp-signature ]
+[ text/plain ]
+[ 4-line signature. Click/Enter to show. ]
+_______________________________________________
+notmuch mailing list
+notmuch@notmuchmail.org
+http://notmuchmail.org/mailman/listinfo/notmuch
diff --git a/test/tree.expected-output/notmuch-tree-single-thread b/test/tree.expected-output/notmuch-tree-single-thread
new file mode 100644
index 0000000..c9e5ef8
--- /dev/null
+++ b/test/tree.expected-output/notmuch-tree-single-thread
@@ -0,0 +1,6 @@
+ 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox)
+ 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
+ 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
+ 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+End of search results.
diff --git a/test/tree.expected-output/notmuch-tree-tag-inbox b/test/tree.expected-output/notmuch-tree-tag-inbox
new file mode 100644
index 0000000..484141e
--- /dev/null
+++ b/test/tree.expected-output/notmuch-tree-tag-inbox
@@ -0,0 +1,53 @@
+ 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread)
+ 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread)
+ 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread)
+ 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread)
+ 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread)
+ 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread)
+ 2009-11-18 Keith Packard ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread)
+ 2009-11-18 Keith Packard ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread)
+ 2009-11-17 Jan Janak ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread)
+ 2009-11-18 Keith Packard ╰┬► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
+ 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
+ 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread)
+ 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread)
+ 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread)
+ 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread)
+ 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread)
+ 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
+ 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
+ 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
+ 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread)
+ 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread)
+ 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread)
+ 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread)
+ 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread)
+ 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread)
+ 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread)
+ 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread)
+ 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread)
+ 2009-11-17 Carl Worth ╰─► ... (inbox, unread)
+End of search results.
diff --git a/test/tree.expected-output/notmuch-tree-tag-inbox-tagged b/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
new file mode 100644
index 0000000..1f75a34
--- /dev/null
+++ b/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
@@ -0,0 +1,53 @@
+ 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread)
+ 2010-12-16 Olivier Berger ─►Essai accentué (inbox, test_tag, unread)
+ 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread)
+ 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread)
+ 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread)
+ 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread)
+ 2009-11-18 Keith Packard ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread)
+ 2009-11-18 Keith Packard ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread)
+ 2009-11-17 Jan Janak ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread)
+ 2009-11-18 Keith Packard ╰┬► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
+ 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
+ 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread)
+ 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread)
+ 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread)
+ 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread)
+ 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread)
+ 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
+ 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
+ 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
+ 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread)
+ 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread)
+ 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread)
+ 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread)
+ 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread)
+ 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread)
+ 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread)
+ 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread)
+ 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread)
+ 2009-11-17 Carl Worth ╰─► ... (inbox, unread)
+End of search results.
diff --git a/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged b/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
new file mode 100644
index 0000000..a7aba6e
--- /dev/null
+++ b/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
@@ -0,0 +1,53 @@
+ 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread)
+ 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread)
+ 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread)
+ 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread)
+ 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread)
+ 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread)
+ 2009-11-18 Keith Packard ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread)
+ 2009-11-18 Keith Packard ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread)
+ 2009-11-17 Jan Janak ├─► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread)
+ 2009-11-18 Keith Packard ╰┬► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
+ 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread)
+ 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, test_thread_tag, unread)
+ 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, test_thread_tag, unread)
+ 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, test_thread_tag, unread)
+ 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, test_thread_tag, unread)
+ 2009-11-17 Keith Packard │ ╰┬► ... (inbox, test_thread_tag, unread)
+ 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, test_thread_tag, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, test_thread_tag, unread)
+ 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
+ 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread)
+ 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread)
+ 2009-11-17 Keith Packard ╰┬► ... (inbox, unread)
+ 2009-11-18 Carl Worth ╰─► ... (inbox, unread)
+ 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread)
+ 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread)
+ 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread)
+ 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread)
+ 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread)
+ 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread)
+ 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread)
+ 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread)
+ 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread)
+ 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread)
+ 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread)
+ 2009-11-17 Carl Worth ╰─► ... (inbox, unread)
+End of search results.
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 06/11] emacs: tree: remove test for emacs from tree test
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (4 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 05/11] test: move emacs-tree test into mainline Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 07/11] emacs: minimal change to autoload notmuch-tree Mark Walters
` (7 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
Now the test is in mainline we can remove the check that emacs exists.
---
test/emacs-tree | 7 -------
1 files changed, 0 insertions(+), 7 deletions(-)
diff --git a/test/emacs-tree b/test/emacs-tree
index 05ce85d..4e3b624 100755
--- a/test/emacs-tree
+++ b/test/emacs-tree
@@ -6,13 +6,6 @@ test_description="emacs tree view interface"
EXPECTED=$TEST_DIRECTORY/tree.expected-output
add_email_corpus
-test_begin_subtest "Do we have emacs"
-test_emacs '(insert "hello\n")
- (test-output)'
-cat <<EOF >EXPECTED
-hello
-EOF
-test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "Basic notmuch-tree view in emacs"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 07/11] emacs: minimal change to autoload notmuch-tree
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (5 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 06/11] emacs: tree: remove test for emacs from tree test Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 08/11] test: tree: remove require from tests Mark Walters
` (6 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
We want to autoload notmuch-tree.el so include it as a require in
notmuch.el. To avoid circular dependency we need to move one
keybinding from notmuch-tree.el to notmuch.el: it makes sense for it
to be defined there anyway.
Since tree is now autoloaded there is no need to print a message when
it is loaded.
---
emacs/notmuch-tree.el | 3 ---
emacs/notmuch.el | 2 ++
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index d3330a0..ebfb5e7 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -29,7 +29,6 @@
(require 'notmuch-show)
(require 'notmuch-tag)
(require 'notmuch-parser)
-(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here
(eval-when-compile (require 'cl))
(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line))
@@ -939,8 +938,6 @@ The arguments are:
;; Set up key bindings from the rest of notmuch.
(define-key notmuch-common-keymap "z" 'notmuch-tree)
-(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query)
(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
-(message "Initialised notmuch-tree")
(provide 'notmuch-tree)
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index 19210cb..418c781 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -54,6 +54,7 @@
(require 'notmuch-lib)
(require 'notmuch-tag)
(require 'notmuch-show)
+(require 'notmuch-tree)
(require 'notmuch-mua)
(require 'notmuch-hello)
(require 'notmuch-maildir-fcc)
@@ -156,6 +157,7 @@ To enter a line break in customize, press \\[quoted-insert] C-j."
(define-key map "-" 'notmuch-search-remove-tag)
(define-key map "+" 'notmuch-search-add-tag)
(define-key map (kbd "RET") 'notmuch-search-show-thread)
+ (define-key map "Z" 'notmuch-tree-from-search-current-query)
map)
"Keymap for \"notmuch search\" buffers.")
(fset 'notmuch-search-mode-map notmuch-search-mode-map)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 08/11] test: tree: remove require from tests
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (6 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 07/11] emacs: minimal change to autoload notmuch-tree Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 09/11] emacs: move search based tree functions to notmuch.el Mark Walters
` (5 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
Now tree is autoloaded we don't need to "require it" in the test.
---
test/emacs-tree | 6 ------
1 files changed, 0 insertions(+), 6 deletions(-)
diff --git a/test/emacs-tree b/test/emacs-tree
index 4e3b624..4bdfddd 100755
--- a/test/emacs-tree
+++ b/test/emacs-tree
@@ -9,7 +9,6 @@ add_email_corpus
test_begin_subtest "Basic notmuch-tree view in emacs"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(test-output)
@@ -18,7 +17,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
test_begin_subtest "Refreshed notmuch-tree view in emacs"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(notmuch-tree-refresh-view)
@@ -33,7 +31,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
test_begin_subtest "Tag message in notmuch tree view (display)"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(forward-line)
@@ -48,7 +45,6 @@ test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr"
test_begin_subtest "Untag message in notmuch tree view"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(forward-line)
@@ -63,7 +59,6 @@ test_expect_equal "$output" ""
test_begin_subtest "Tag thread in notmuch tree view"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
;; move to a sizable thread
@@ -86,7 +81,6 @@ id:20091117190054.GU3165@dottiness.seas.harvard.edu"
test_begin_subtest "Untag thread in notmuch tree view"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
;; move to the same sizable thread as above
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 09/11] emacs: move search based tree functions to notmuch.el
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (7 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 08/11] test: tree: remove require from tests Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 10/11] emacs: add z to common keymap Mark Walters
` (4 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
Move a couple of the search mode specifc caller helpers for tree from
tree into notmuch.el.
---
emacs/notmuch-tree.el | 18 ------------------
emacs/notmuch.el | 14 ++++++++++++++
2 files changed, 14 insertions(+), 18 deletions(-)
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index ebfb5e7..78b4a57 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -413,24 +413,6 @@ Does NOT change the database."
notmuch-show-query-context
(notmuch-show-get-message-id)))
-;; This function should be in notmuch.el but be we trying to minimise
-;; impact on the rest of the codebase.
-(defun notmuch-tree-from-search-current-query ()
- "Call notmuch tree with the current query"
- (interactive)
- (notmuch-tree notmuch-search-query-string))
-
-;; This function should be in notmuch.el but be we trying to minimise
-;; impact on the rest of the codebase.
-(defun notmuch-tree-from-search-thread ()
- "Show the selected thread with notmuch-tree"
- (interactive)
- (notmuch-tree (notmuch-search-find-thread-id)
- notmuch-search-query-string
- nil
- (notmuch-prettify-subject (notmuch-search-find-subject))
- t))
-
(defun notmuch-tree-message-window-kill-hook ()
"Close the message pane when exiting the show buffer."
(let ((buffer (current-buffer)))
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index 418c781..2c9a07c 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -439,6 +439,20 @@ If BARE is set then do not prefix with \"thread:\""
(concat "*" (truncate-string-to-width subject 30 nil nil t) "*"))
(message "End of search results."))))
+(defun notmuch-tree-from-search-current-query ()
+ "Call notmuch tree with the current query"
+ (interactive)
+ (notmuch-tree notmuch-search-query-string))
+
+(defun notmuch-tree-from-search-thread ()
+ "Show the selected thread with notmuch-tree"
+ (interactive)
+ (notmuch-tree (notmuch-search-find-thread-id)
+ notmuch-search-query-string
+ nil
+ (notmuch-prettify-subject (notmuch-search-find-subject))
+ t))
+
(defun notmuch-search-reply-to-thread (&optional prompt-for-sender)
"Begin composing a reply-all to the entire current thread in a new buffer."
(interactive "P")
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 10/11] emacs: add z to common keymap
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (8 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 09/11] emacs: move search based tree functions to notmuch.el Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-29 22:55 ` [PATCH 11/11] emacs: move the show entry to tree into show.el Mark Walters
` (3 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
Add the main entry "z" to notmuch-tree to the common keymap.
---
emacs/notmuch-lib.el | 1 +
emacs/notmuch-tree.el | 1 -
2 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
index e7c5c97..921ed20 100644
--- a/emacs/notmuch-lib.el
+++ b/emacs/notmuch-lib.el
@@ -133,6 +133,7 @@ For example, if you wanted to remove an \"inbox\" tag and add an
(define-key map "?" 'notmuch-help)
(define-key map "q" 'notmuch-kill-this-buffer)
(define-key map "s" 'notmuch-search)
+ (define-key map "z" 'notmuch-tree)
(define-key map "m" 'notmuch-mua-new-mail)
(define-key map "=" 'notmuch-refresh-this-buffer)
(define-key map "G" 'notmuch-poll-and-refresh-this-buffer)
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index 78b4a57..c66dd35 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -919,7 +919,6 @@ The arguments are:
;; Set up key bindings from the rest of notmuch.
-(define-key notmuch-common-keymap "z" 'notmuch-tree)
(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
(provide 'notmuch-tree)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 11/11] emacs: move the show entry to tree into show.el
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (9 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 10/11] emacs: add z to common keymap Mark Walters
@ 2013-10-29 22:55 ` Mark Walters
2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila
` (2 subsequent siblings)
13 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw)
To: notmuch
Move the keybinding and show specific helper from tree.el to show.el
---
emacs/notmuch-show.el | 10 ++++++++++
emacs/notmuch-tree.el | 12 +-----------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 9e8b9c0..f00273a 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -44,6 +44,8 @@
(declare-function notmuch-foreach-mime-part "notmuch" (function mm-handle))
(declare-function notmuch-count-attachments "notmuch" (mm-handle))
(declare-function notmuch-save-attachments "notmuch" (mm-handle &optional queryp))
+(declare-function notmuch-tree "notmuch-tree"
+ (&optional query query-context target buffer-name open-target))
(defcustom notmuch-message-headers '("Subject" "To" "Cc" "Date")
"Headers that should be shown in a message, in this order.
@@ -1247,6 +1249,7 @@ reset based on the original query."
(defvar notmuch-show-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map notmuch-common-keymap)
+ (define-key map "Z" 'notmuch-tree-from-show-current-query)
(define-key map (kbd "<C-tab>") 'widget-backward)
(define-key map (kbd "M-TAB") 'notmuch-show-previous-button)
(define-key map (kbd "<backtab>") 'notmuch-show-previous-button)
@@ -1323,6 +1326,13 @@ All currently available key bindings:
(setq buffer-read-only t
truncate-lines t))
+(defun notmuch-tree-from-show-current-query ()
+ "Call notmuch tree with the current query"
+ (interactive)
+ (notmuch-tree notmuch-show-thread-id
+ notmuch-show-query-context
+ (notmuch-show-get-message-id)))
+
(defun notmuch-show-move-to-message-top ()
(goto-char (notmuch-show-message-top)))
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index c66dd35..f13b41f 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -404,15 +404,6 @@ Does NOT change the database."
(notmuch-tree-close-message-window)
(notmuch-tree query)))
-;; This function should be in notmuch-show.el but be we trying to
-;; minimise impact on the rest of the codebase.
-(defun notmuch-tree-from-show-current-query ()
- "Call notmuch tree with the current query"
- (interactive)
- (notmuch-tree notmuch-show-thread-id
- notmuch-show-query-context
- (notmuch-show-get-message-id)))
-
(defun notmuch-tree-message-window-kill-hook ()
"Close the message pane when exiting the show buffer."
(let ((buffer (current-buffer)))
@@ -918,7 +909,6 @@ The arguments are:
(setq truncate-lines t))
-;; Set up key bindings from the rest of notmuch.
-(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
+;;
(provide 'notmuch-tree)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 00/11] Move notmuch-tree to mainline
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (10 preceding siblings ...)
2013-10-29 22:55 ` [PATCH 11/11] emacs: move the show entry to tree into show.el Mark Walters
@ 2013-10-30 18:01 ` Tomi Ollila
2013-10-30 18:48 ` Mark Walters
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
2013-11-07 12:20 ` [PATCH 00/11] Move notmuch-tree to mainline David Bremner
13 siblings, 1 reply; 22+ messages in thread
From: Tomi Ollila @ 2013-10-30 18:01 UTC (permalink / raw)
To: Mark Walters, notmuch
On Wed, Oct 30 2013, Mark Walters <markwalters1009@gmail.com> wrote:
> This is a more complete version of the move of pick/tree to
> mainline. The previous version was at
> id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com
This series looks pretty good to me. IMO patches 1-6 are ready...
> The previous version did not get the autoloading right: it all worked
> on my setup as I had stale files around in my tree which were loaded.
> This versions builds and tests pass at each stage on a fresh clone.
You and Me seem to have different understanding what "autoload"ing means.
To me autoloading means using (autoload ...) function. In patch 7
( id:1383087338-10220-8-git-send-email-markwalters1009@gmail.com )
(require 'notmuch-tree) is used.
To me it is fine if this approach is taken, but then calling it autoloading
in commit message (in patches 7 and 8) is confusing.
However, if (autoload ...) syntax were actually used, it could be done
the somewhat the following way:
* Don't add (require 'notmuch-tree) in notmuch.el (Patch 7)
* Add (autoload 'notmuch-tree-from-search-current-query "notmuch-tree" "docstring" t)
to notmuch.el (maybe we can live without declare-function ?)
* Add (autoload 'notmuch-tree "notmuch-tree" "docstring" t) to
notmuch-lib.el.
* Now Patch 9 is good as it is now.
* Don't move the functions mentioned in Patch 9 from notmuch-tree.el to
notmuch.el but write autoload (for notmuch-tree-from-search-thread) to
notmuch.el
* Now Patch 10 is good as it is now.
* Leave notmuch-tree-from-show-current-query in notmuch-tree.el, and add
autoload for it in notmuch-show.el. Now you can also drop
(declare-function notmuch-tree ...) out from notmuch-show.el (Patch 11).
Tomi
> The diffstat at the bottom of this message is huge, so I include the
> rather more informative output from git diff -stat -M here.
>
> Apart from the first patch (which moves 80 lines from notmuch.el to notmuch-lib.el) the total is:
> emacs/Makefile.local | 1 +
> emacs/notmuch-lib.el | 1 +
> emacs/notmuch-show.el | 10 ++++
> {contrib/notmuch-pick => emacs}/notmuch-tree.el | 47 ++-----------------
> emacs/notmuch.el | 16 +++++++
> {contrib/notmuch-pick/test => test}/emacs-tree | 13 -----
> test/notmuch-test | 1 +
> .../tree.expected-output/notmuch-tree-show-window | 0
> .../notmuch-tree-single-thread | 0
> .../tree.expected-output/notmuch-tree-tag-inbox | 0
> .../notmuch-tree-tag-inbox-tagged | 0
> .../notmuch-tree-tag-inbox-thread-tagged | 0
> 12 files changed, 34 insertions(+), 55 deletions(-)
>
>
> Obviously this clashes with the remap/help series at
> id:1382821479-23384-1-git-send-email-markwalters1009@gmail.com but
> rebasing either way would be easy.
>
> Best wishes
>
> Mark
>
>
>
>
>
> Mark Walters (11):
> emacs: move notmuch-help to lib
> emacs: tree: remove unneeded declarations
> emacs: move notmuch-tree from contrib to mainline
> emacs: add tree to the makefile
> test: move emacs-tree test into mainline
> emacs: tree: remove test for emacs from tree test
> emacs: minimal change to autoload notmuch-tree
> test: tree: remove require from tests
> emacs: move search based tree functions to notmuch.el
> emacs: add z to common keymap
> emacs: move the show entry to tree into show.el
>
> contrib/notmuch-pick/notmuch-tree.el | 951 --------------------
> contrib/notmuch-pick/test/emacs-tree | 210 -----
> .../tree.expected-output/notmuch-tree-show-window | 40 -
> .../notmuch-tree-single-thread | 6 -
> .../tree.expected-output/notmuch-tree-tag-inbox | 53 --
> .../notmuch-tree-tag-inbox-tagged | 53 --
> .../notmuch-tree-tag-inbox-thread-tagged | 53 --
> emacs/Makefile.local | 1 +
> emacs/notmuch-lib.el | 88 ++
> emacs/notmuch-show.el | 10 +
> emacs/notmuch-tree.el | 914 +++++++++++++++++++
> emacs/notmuch.el | 103 +--
> test/emacs-tree | 197 ++++
> test/notmuch-test | 1 +
> test/tree.expected-output/notmuch-tree-show-window | 40 +
> .../notmuch-tree-single-thread | 6 +
> test/tree.expected-output/notmuch-tree-tag-inbox | 53 ++
> .../notmuch-tree-tag-inbox-tagged | 53 ++
> .../notmuch-tree-tag-inbox-thread-tagged | 53 ++
> 19 files changed, 1432 insertions(+), 1453 deletions(-)
> delete mode 100644 contrib/notmuch-pick/notmuch-tree.el
> delete mode 100755 contrib/notmuch-pick/test/emacs-tree
> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window
> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread
> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox
> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
> create mode 100644 emacs/notmuch-tree.el
> create mode 100755 test/emacs-tree
> create mode 100644 test/tree.expected-output/notmuch-tree-show-window
> create mode 100644 test/tree.expected-output/notmuch-tree-single-thread
> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox
> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged
> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
>
> --
> 1.7.9.1
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/11] Move notmuch-tree to mainline
2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila
@ 2013-10-30 18:48 ` Mark Walters
0 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-10-30 18:48 UTC (permalink / raw)
To: Tomi Ollila, notmuch
Hi
Thanks for the review
On Wed, 30 Oct 2013, Tomi Ollila <tomi.ollila@iki.fi> wrote:
> On Wed, Oct 30 2013, Mark Walters <markwalters1009@gmail.com> wrote:
>
>> This is a more complete version of the move of pick/tree to
>> mainline. The previous version was at
>> id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com
>
> This series looks pretty good to me. IMO patches 1-6 are ready...
>
>> The previous version did not get the autoloading right: it all worked
>> on my setup as I had stale files around in my tree which were loaded.
>> This versions builds and tests pass at each stage on a fresh clone.
>
> You and Me seem to have different understanding what "autoload"ing means.
Sorry about that; I just meant that it was automatically loaded when
notmuch was loaded (that is the user no longer needs an explicit
(require 'notmuch-tree) in their .emacs file.
I would probably just stick with the require approach (to be consistent
with show etc) unless you (or others) prefer the real autoload as you
describe.
I will fix the commit messages in the next version.
Many thanks
Mark
> To me autoloading means using (autoload ...) function. In patch 7
> ( id:1383087338-10220-8-git-send-email-markwalters1009@gmail.com )
> (require 'notmuch-tree) is used.
>
> To me it is fine if this approach is taken, but then calling it autoloading
> in commit message (in patches 7 and 8) is confusing.
>
> However, if (autoload ...) syntax were actually used, it could be done
> the somewhat the following way:
>
> * Don't add (require 'notmuch-tree) in notmuch.el (Patch 7)
>
> * Add (autoload 'notmuch-tree-from-search-current-query "notmuch-tree" "docstring" t)
> to notmuch.el (maybe we can live without declare-function ?)
>
> * Add (autoload 'notmuch-tree "notmuch-tree" "docstring" t) to
> notmuch-lib.el.
>
> * Now Patch 9 is good as it is now.
>
> * Don't move the functions mentioned in Patch 9 from notmuch-tree.el to
> notmuch.el but write autoload (for notmuch-tree-from-search-thread) to
> notmuch.el
>
> * Now Patch 10 is good as it is now.
>
> * Leave notmuch-tree-from-show-current-query in notmuch-tree.el, and add
> autoload for it in notmuch-show.el. Now you can also drop
> (declare-function notmuch-tree ...) out from notmuch-show.el (Patch 11).
>
>
> Tomi
>
>
>> The diffstat at the bottom of this message is huge, so I include the
>> rather more informative output from git diff -stat -M here.
>>
>> Apart from the first patch (which moves 80 lines from notmuch.el to notmuch-lib.el) the total is:
>> emacs/Makefile.local | 1 +
>> emacs/notmuch-lib.el | 1 +
>> emacs/notmuch-show.el | 10 ++++
>> {contrib/notmuch-pick => emacs}/notmuch-tree.el | 47 ++-----------------
>> emacs/notmuch.el | 16 +++++++
>> {contrib/notmuch-pick/test => test}/emacs-tree | 13 -----
>> test/notmuch-test | 1 +
>> .../tree.expected-output/notmuch-tree-show-window | 0
>> .../notmuch-tree-single-thread | 0
>> .../tree.expected-output/notmuch-tree-tag-inbox | 0
>> .../notmuch-tree-tag-inbox-tagged | 0
>> .../notmuch-tree-tag-inbox-thread-tagged | 0
>> 12 files changed, 34 insertions(+), 55 deletions(-)
>>
>>
>> Obviously this clashes with the remap/help series at
>> id:1382821479-23384-1-git-send-email-markwalters1009@gmail.com but
>> rebasing either way would be easy.
>>
>> Best wishes
>>
>> Mark
>>
>>
>>
>>
>>
>> Mark Walters (11):
>> emacs: move notmuch-help to lib
>> emacs: tree: remove unneeded declarations
>> emacs: move notmuch-tree from contrib to mainline
>> emacs: add tree to the makefile
>> test: move emacs-tree test into mainline
>> emacs: tree: remove test for emacs from tree test
>> emacs: minimal change to autoload notmuch-tree
>> test: tree: remove require from tests
>> emacs: move search based tree functions to notmuch.el
>> emacs: add z to common keymap
>> emacs: move the show entry to tree into show.el
>>
>> contrib/notmuch-pick/notmuch-tree.el | 951 --------------------
>> contrib/notmuch-pick/test/emacs-tree | 210 -----
>> .../tree.expected-output/notmuch-tree-show-window | 40 -
>> .../notmuch-tree-single-thread | 6 -
>> .../tree.expected-output/notmuch-tree-tag-inbox | 53 --
>> .../notmuch-tree-tag-inbox-tagged | 53 --
>> .../notmuch-tree-tag-inbox-thread-tagged | 53 --
>> emacs/Makefile.local | 1 +
>> emacs/notmuch-lib.el | 88 ++
>> emacs/notmuch-show.el | 10 +
>> emacs/notmuch-tree.el | 914 +++++++++++++++++++
>> emacs/notmuch.el | 103 +--
>> test/emacs-tree | 197 ++++
>> test/notmuch-test | 1 +
>> test/tree.expected-output/notmuch-tree-show-window | 40 +
>> .../notmuch-tree-single-thread | 6 +
>> test/tree.expected-output/notmuch-tree-tag-inbox | 53 ++
>> .../notmuch-tree-tag-inbox-tagged | 53 ++
>> .../notmuch-tree-tag-inbox-thread-tagged | 53 ++
>> 19 files changed, 1432 insertions(+), 1453 deletions(-)
>> delete mode 100644 contrib/notmuch-pick/notmuch-tree.el
>> delete mode 100755 contrib/notmuch-pick/test/emacs-tree
>> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window
>> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread
>> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox
>> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged
>> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
>> create mode 100644 emacs/notmuch-tree.el
>> create mode 100755 test/emacs-tree
>> create mode 100644 test/tree.expected-output/notmuch-tree-show-window
>> create mode 100644 test/tree.expected-output/notmuch-tree-single-thread
>> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox
>> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged
>> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged
>>
>> --
>> 1.7.9.1
>>
>> _______________________________________________
>> notmuch mailing list
>> notmuch@notmuchmail.org
>> http://notmuchmail.org/mailman/listinfo/notmuch
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 7-11] Fix commit messages
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (11 preceding siblings ...)
2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila
@ 2013-11-01 9:23 ` Mark Walters
2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters
` (5 more replies)
2013-11-07 12:20 ` [PATCH 00/11] Move notmuch-tree to mainline David Bremner
13 siblings, 6 replies; 22+ messages in thread
From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw)
To: notmuch
This just fixes the commit message in patches 7 and 8 to not say
autoload as that means something different.
Best wishes
Mark
Mark Walters (5):
emacs: minimal change to load notmuch-tree by default
test: tree: remove require from tests
emacs: move search based tree functions to notmuch.el
emacs: add z to common keymap
emacs: move the show entry to tree into show.el
emacs/notmuch-lib.el | 1 +
emacs/notmuch-show.el | 10 ++++++++++
emacs/notmuch-tree.el | 34 +---------------------------------
emacs/notmuch.el | 16 ++++++++++++++++
test/emacs-tree | 6 ------
5 files changed, 28 insertions(+), 39 deletions(-)
--
1.7.9.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
@ 2013-11-01 9:23 ` Mark Walters
2013-11-01 9:23 ` [PATCH v2 8/11] test: tree: remove require from tests Mark Walters
` (4 subsequent siblings)
5 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw)
To: notmuch
We want to load notmuch-tree when notmuch is loaded, so include it as
a require in notmuch.el. To avoid circular dependency we need to move
one keybinding from notmuch-tree.el to notmuch.el: it makes sense for
it to be defined there anyway.
Since tree is now loaded by default there is no need to print a
message when it is loaded.
---
emacs/notmuch-tree.el | 3 ---
emacs/notmuch.el | 2 ++
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index d3330a0..ebfb5e7 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -29,7 +29,6 @@
(require 'notmuch-show)
(require 'notmuch-tag)
(require 'notmuch-parser)
-(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here
(eval-when-compile (require 'cl))
(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line))
@@ -939,8 +938,6 @@ The arguments are:
;; Set up key bindings from the rest of notmuch.
(define-key notmuch-common-keymap "z" 'notmuch-tree)
-(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query)
(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
-(message "Initialised notmuch-tree")
(provide 'notmuch-tree)
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index 19210cb..418c781 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -54,6 +54,7 @@
(require 'notmuch-lib)
(require 'notmuch-tag)
(require 'notmuch-show)
+(require 'notmuch-tree)
(require 'notmuch-mua)
(require 'notmuch-hello)
(require 'notmuch-maildir-fcc)
@@ -156,6 +157,7 @@ To enter a line break in customize, press \\[quoted-insert] C-j."
(define-key map "-" 'notmuch-search-remove-tag)
(define-key map "+" 'notmuch-search-add-tag)
(define-key map (kbd "RET") 'notmuch-search-show-thread)
+ (define-key map "Z" 'notmuch-tree-from-search-current-query)
map)
"Keymap for \"notmuch search\" buffers.")
(fset 'notmuch-search-mode-map notmuch-search-mode-map)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 8/11] test: tree: remove require from tests
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters
@ 2013-11-01 9:23 ` Mark Walters
2013-11-01 9:23 ` [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el Mark Walters
` (3 subsequent siblings)
5 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw)
To: notmuch
Now tree is included by default we don't need to "require it" in the
test.
---
test/emacs-tree | 6 ------
1 files changed, 0 insertions(+), 6 deletions(-)
diff --git a/test/emacs-tree b/test/emacs-tree
index 4e3b624..4bdfddd 100755
--- a/test/emacs-tree
+++ b/test/emacs-tree
@@ -9,7 +9,6 @@ add_email_corpus
test_begin_subtest "Basic notmuch-tree view in emacs"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(test-output)
@@ -18,7 +17,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
test_begin_subtest "Refreshed notmuch-tree view in emacs"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(notmuch-tree-refresh-view)
@@ -33,7 +31,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
test_begin_subtest "Tag message in notmuch tree view (display)"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(forward-line)
@@ -48,7 +45,6 @@ test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr"
test_begin_subtest "Untag message in notmuch tree view"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
(forward-line)
@@ -63,7 +59,6 @@ test_expect_equal "$output" ""
test_begin_subtest "Tag thread in notmuch tree view"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
;; move to a sizable thread
@@ -86,7 +81,6 @@ id:20091117190054.GU3165@dottiness.seas.harvard.edu"
test_begin_subtest "Untag thread in notmuch tree view"
test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
- (require (quote notmuch-tree))
(notmuch-tree "tag:inbox")
(notmuch-test-wait)
;; move to the same sizable thread as above
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters
2013-11-01 9:23 ` [PATCH v2 8/11] test: tree: remove require from tests Mark Walters
@ 2013-11-01 9:23 ` Mark Walters
2013-11-01 9:23 ` [PATCH v2 10/11] emacs: add z to common keymap Mark Walters
` (2 subsequent siblings)
5 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw)
To: notmuch
Move a couple of the search mode specifc caller helpers for tree from
tree into notmuch.el.
---
emacs/notmuch-tree.el | 18 ------------------
emacs/notmuch.el | 14 ++++++++++++++
2 files changed, 14 insertions(+), 18 deletions(-)
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index ebfb5e7..78b4a57 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -413,24 +413,6 @@ Does NOT change the database."
notmuch-show-query-context
(notmuch-show-get-message-id)))
-;; This function should be in notmuch.el but be we trying to minimise
-;; impact on the rest of the codebase.
-(defun notmuch-tree-from-search-current-query ()
- "Call notmuch tree with the current query"
- (interactive)
- (notmuch-tree notmuch-search-query-string))
-
-;; This function should be in notmuch.el but be we trying to minimise
-;; impact on the rest of the codebase.
-(defun notmuch-tree-from-search-thread ()
- "Show the selected thread with notmuch-tree"
- (interactive)
- (notmuch-tree (notmuch-search-find-thread-id)
- notmuch-search-query-string
- nil
- (notmuch-prettify-subject (notmuch-search-find-subject))
- t))
-
(defun notmuch-tree-message-window-kill-hook ()
"Close the message pane when exiting the show buffer."
(let ((buffer (current-buffer)))
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index 418c781..2c9a07c 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -439,6 +439,20 @@ If BARE is set then do not prefix with \"thread:\""
(concat "*" (truncate-string-to-width subject 30 nil nil t) "*"))
(message "End of search results."))))
+(defun notmuch-tree-from-search-current-query ()
+ "Call notmuch tree with the current query"
+ (interactive)
+ (notmuch-tree notmuch-search-query-string))
+
+(defun notmuch-tree-from-search-thread ()
+ "Show the selected thread with notmuch-tree"
+ (interactive)
+ (notmuch-tree (notmuch-search-find-thread-id)
+ notmuch-search-query-string
+ nil
+ (notmuch-prettify-subject (notmuch-search-find-subject))
+ t))
+
(defun notmuch-search-reply-to-thread (&optional prompt-for-sender)
"Begin composing a reply-all to the entire current thread in a new buffer."
(interactive "P")
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 10/11] emacs: add z to common keymap
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
` (2 preceding siblings ...)
2013-11-01 9:23 ` [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el Mark Walters
@ 2013-11-01 9:23 ` Mark Walters
2013-11-01 9:23 ` [PATCH v2 11/11] emacs: move the show entry to tree into show.el Mark Walters
2013-11-01 12:04 ` [PATCH v2 7-11] Fix commit messages Tomi Ollila
5 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw)
To: notmuch
Add the main entry "z" to notmuch-tree to the common keymap.
---
emacs/notmuch-lib.el | 1 +
emacs/notmuch-tree.el | 1 -
2 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
index e7c5c97..921ed20 100644
--- a/emacs/notmuch-lib.el
+++ b/emacs/notmuch-lib.el
@@ -133,6 +133,7 @@ For example, if you wanted to remove an \"inbox\" tag and add an
(define-key map "?" 'notmuch-help)
(define-key map "q" 'notmuch-kill-this-buffer)
(define-key map "s" 'notmuch-search)
+ (define-key map "z" 'notmuch-tree)
(define-key map "m" 'notmuch-mua-new-mail)
(define-key map "=" 'notmuch-refresh-this-buffer)
(define-key map "G" 'notmuch-poll-and-refresh-this-buffer)
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index 78b4a57..c66dd35 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -919,7 +919,6 @@ The arguments are:
;; Set up key bindings from the rest of notmuch.
-(define-key notmuch-common-keymap "z" 'notmuch-tree)
(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
(provide 'notmuch-tree)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 11/11] emacs: move the show entry to tree into show.el
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
` (3 preceding siblings ...)
2013-11-01 9:23 ` [PATCH v2 10/11] emacs: add z to common keymap Mark Walters
@ 2013-11-01 9:23 ` Mark Walters
2013-11-01 12:04 ` [PATCH v2 7-11] Fix commit messages Tomi Ollila
5 siblings, 0 replies; 22+ messages in thread
From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw)
To: notmuch
Move the keybinding and show specific helper from tree.el to show.el
---
emacs/notmuch-show.el | 10 ++++++++++
emacs/notmuch-tree.el | 12 +-----------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 9e8b9c0..f00273a 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -44,6 +44,8 @@
(declare-function notmuch-foreach-mime-part "notmuch" (function mm-handle))
(declare-function notmuch-count-attachments "notmuch" (mm-handle))
(declare-function notmuch-save-attachments "notmuch" (mm-handle &optional queryp))
+(declare-function notmuch-tree "notmuch-tree"
+ (&optional query query-context target buffer-name open-target))
(defcustom notmuch-message-headers '("Subject" "To" "Cc" "Date")
"Headers that should be shown in a message, in this order.
@@ -1247,6 +1249,7 @@ reset based on the original query."
(defvar notmuch-show-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map notmuch-common-keymap)
+ (define-key map "Z" 'notmuch-tree-from-show-current-query)
(define-key map (kbd "<C-tab>") 'widget-backward)
(define-key map (kbd "M-TAB") 'notmuch-show-previous-button)
(define-key map (kbd "<backtab>") 'notmuch-show-previous-button)
@@ -1323,6 +1326,13 @@ All currently available key bindings:
(setq buffer-read-only t
truncate-lines t))
+(defun notmuch-tree-from-show-current-query ()
+ "Call notmuch tree with the current query"
+ (interactive)
+ (notmuch-tree notmuch-show-thread-id
+ notmuch-show-query-context
+ (notmuch-show-get-message-id)))
+
(defun notmuch-show-move-to-message-top ()
(goto-char (notmuch-show-message-top)))
diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el
index c66dd35..f13b41f 100644
--- a/emacs/notmuch-tree.el
+++ b/emacs/notmuch-tree.el
@@ -404,15 +404,6 @@ Does NOT change the database."
(notmuch-tree-close-message-window)
(notmuch-tree query)))
-;; This function should be in notmuch-show.el but be we trying to
-;; minimise impact on the rest of the codebase.
-(defun notmuch-tree-from-show-current-query ()
- "Call notmuch tree with the current query"
- (interactive)
- (notmuch-tree notmuch-show-thread-id
- notmuch-show-query-context
- (notmuch-show-get-message-id)))
-
(defun notmuch-tree-message-window-kill-hook ()
"Close the message pane when exiting the show buffer."
(let ((buffer (current-buffer)))
@@ -918,7 +909,6 @@ The arguments are:
(setq truncate-lines t))
-;; Set up key bindings from the rest of notmuch.
-(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query)
+;;
(provide 'notmuch-tree)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v2 7-11] Fix commit messages
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
` (4 preceding siblings ...)
2013-11-01 9:23 ` [PATCH v2 11/11] emacs: move the show entry to tree into show.el Mark Walters
@ 2013-11-01 12:04 ` Tomi Ollila
5 siblings, 0 replies; 22+ messages in thread
From: Tomi Ollila @ 2013-11-01 12:04 UTC (permalink / raw)
To: Mark Walters, notmuch
On Fri, Nov 01 2013, Mark Walters <markwalters1009@gmail.com> wrote:
> This just fixes the commit message in patches 7 and 8 to not say
> autoload as that means something different.
The series not LGTM. Patches apply (w/ one known whitespace message)
and tests pass.
Tomi
>
> Best wishes
>
> Mark
>
> Mark Walters (5):
> emacs: minimal change to load notmuch-tree by default
> test: tree: remove require from tests
> emacs: move search based tree functions to notmuch.el
> emacs: add z to common keymap
> emacs: move the show entry to tree into show.el
>
> emacs/notmuch-lib.el | 1 +
> emacs/notmuch-show.el | 10 ++++++++++
> emacs/notmuch-tree.el | 34 +---------------------------------
> emacs/notmuch.el | 16 ++++++++++++++++
> test/emacs-tree | 6 ------
> 5 files changed, 28 insertions(+), 39 deletions(-)
>
> --
> 1.7.9.1
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/11] Move notmuch-tree to mainline
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
` (12 preceding siblings ...)
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
@ 2013-11-07 12:20 ` David Bremner
13 siblings, 0 replies; 22+ messages in thread
From: David Bremner @ 2013-11-07 12:20 UTC (permalink / raw)
To: Mark Walters, notmuch
Mark Walters <markwalters1009@gmail.com> writes:
> This is a more complete version of the move of pick/tree to
> mainline. The previous version was at
> id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com
pushed, with the reworked commit messages for the last few patches.
d
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2013-11-07 12:21 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters
2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters
2013-10-29 22:55 ` [PATCH 02/11] emacs: tree: remove unneeded declarations Mark Walters
2013-10-29 22:55 ` [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline Mark Walters
2013-10-29 22:55 ` [PATCH 04/11] emacs: add tree to the makefile Mark Walters
2013-10-29 22:55 ` [PATCH 05/11] test: move emacs-tree test into mainline Mark Walters
2013-10-29 22:55 ` [PATCH 06/11] emacs: tree: remove test for emacs from tree test Mark Walters
2013-10-29 22:55 ` [PATCH 07/11] emacs: minimal change to autoload notmuch-tree Mark Walters
2013-10-29 22:55 ` [PATCH 08/11] test: tree: remove require from tests Mark Walters
2013-10-29 22:55 ` [PATCH 09/11] emacs: move search based tree functions to notmuch.el Mark Walters
2013-10-29 22:55 ` [PATCH 10/11] emacs: add z to common keymap Mark Walters
2013-10-29 22:55 ` [PATCH 11/11] emacs: move the show entry to tree into show.el Mark Walters
2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila
2013-10-30 18:48 ` Mark Walters
2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters
2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters
2013-11-01 9:23 ` [PATCH v2 8/11] test: tree: remove require from tests Mark Walters
2013-11-01 9:23 ` [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el Mark Walters
2013-11-01 9:23 ` [PATCH v2 10/11] emacs: add z to common keymap Mark Walters
2013-11-01 9:23 ` [PATCH v2 11/11] emacs: move the show entry to tree into show.el Mark Walters
2013-11-01 12:04 ` [PATCH v2 7-11] Fix commit messages Tomi Ollila
2013-11-07 12:20 ` [PATCH 00/11] Move notmuch-tree to mainline David Bremner
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).