-;;; notmuch-tree.el --- displaying notmuch forests
+;;; notmuch-tree.el --- displaying notmuch forests -*- lexical-binding: t -*-
;;
;; Copyright © Carl Worth
;; Copyright © David Edmondson
;;; Code:
-(eval-when-compile (require 'cl-lib))
-
(require 'mail-parse)
(require 'notmuch-lib)
(defvar-local notmuch-tree-unthreaded nil
"A buffer local copy of argument unthreaded to the function notmuch-tree.")
+;;; Options
+
(defgroup notmuch-tree nil
"Showing message and thread structure."
:group 'notmuch)
notmuch-unthreaded-result-format
notmuch-tree-result-format))
-;; Faces for messages that match the query.
+;;; Faces
+;;;; Faces for messages that match the query
+
(defface notmuch-tree-match-face
'((t :inherit default))
"Default face used in tree mode face for matching messages"
:group 'notmuch-tree
:group 'notmuch-faces)
-;; Faces for messages that do not match the query.
+;;;; Faces for messages that do not match the query
+
(defface notmuch-tree-no-match-face
'((t (:foreground "gray")))
"Default face used in tree mode face for non-matching messages."
:group 'notmuch-tree
:group 'notmuch-faces)
+;;; Variables
+
(defvar-local notmuch-tree-previous-subject
"The subject of the most recent result shown during the async display.")
if the user has loaded a different buffer in that window.")
(put 'notmuch-tree-message-buffer 'permanent-local t)
+;;; Tree wrapper commands
+
(defmacro notmuch-tree--define-do-in-message-window (name cmd)
"Define NAME as a command that calls CMD interactively in the message window.
If the message pane is closed then this command does nothing.
notmuch-tree-view-raw-message
notmuch-show-view-raw-message)
+;;; Keymap
+
(defvar notmuch-tree-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map notmuch-common-keymap)
map)
"Keymap for \"notmuch tree\" buffers.")
+;;; Message properties
+
(defun notmuch-tree-get-message-properties ()
"Return the properties of the current message as a plist.
(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)))
+ (plist-get (or props (notmuch-tree-get-message-properties))
+ prop))
(defun notmuch-tree-set-tags (tags)
"Set the tags of the current message."
(defun notmuch-tree-get-match ()
"Return whether the current message is a match."
- (interactive)
(notmuch-tree-get-prop :match))
+;;; Update display
+
(defun notmuch-tree-refresh-result ()
"Redisplay the current message line.
(when (string= tree-msg-id (notmuch-show-get-message-id))
(notmuch-show-update-tags new-tags)))))))
+;;; Commands (and some helper functions used by them)
+
(defun notmuch-tree-tag (tag-changes)
"Change tags for the current message."
(interactive
"Show the current message (in whole window)."
(interactive)
(let ((id (notmuch-tree-get-message-id))
- (inhibit-read-only t)
- buffer)
+ (inhibit-read-only t))
(when id
;; We close the window to kill off un-needed buffers.
(notmuch-tree-close-message-window)
(notmuch-tree-from-search-thread))))
(defun notmuch-tree-next-thread (&optional previous)
- "Move to the next thread in the current tree or parent search
-results
+ "Move to the next thread in the current tree or parent search results.
If PREVIOUS is non-nil, move to the previous thread in the tree or
search results instead."
(notmuch-tree-next-thread-from-search previous)))
(defun notmuch-tree-prev-thread ()
- "Move to the previous thread in the current tree or parent search
-results"
+ "Move to the previous thread in the current tree or parent search results."
(interactive)
(notmuch-tree-next-thread t))
(defun notmuch-tree-thread-mapcar (function)
- "Iterate through all messages in the current thread
- and call FUNCTION for side effects."
+ "Call FUNCTION for each message in the current thread.
+FUNCTION is called for side effects only."
(save-excursion
(notmuch-tree-thread-top)
(cl-loop collect (funcall function)
(notmuch-tree-tag-thread
(notmuch-tag-change-list notmuch-archive-tags unarchive))))
-;; Functions below here display the tree buffer itself.
+;;; Functions for displaying the tree buffer itself
(defun notmuch-tree-clean-address (address)
"Try to clean a single email ADDRESS for display. Return
(setq buffer-read-only t)
(setq truncate-lines t))
-(defun notmuch-tree-process-sentinel (proc msg)
+(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))
+ (exit-status (process-exit-status proc)))
(when (memq status '(exit signal))
(kill-buffer (process-get proc 'parse-buf))
(when (buffer-live-p buffer)
(with-current-buffer buffer
(save-excursion
- (let ((inhibit-read-only t)
- (atbob (bobp)))
+ (let ((inhibit-read-only t))
(goto-char (point-max))
(when (eq status 'signal)
(insert "Incomplete search results (tree view process was killed).\n"))
"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)
+ (inhibit-read-only t))
(if (not (buffer-live-p results-buf))
(delete-process proc)
(with-current-buffer parse-buf
(interactive)
(notmuch-tree query query-context target buffer-name open-target t))
-;;
+;;; _
(provide 'notmuch-tree)