X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.el;h=ed1f7cb5e3a2b21e789cfe16bca10acd03969a44;hp=70dbe5ba7f6baaf8ebfec6cce86e1ea73234df1a;hb=60817c39d83a67e0dca5e154588672d962d24c5c;hpb=00c0896c9b9369ec2a844cea4d841be7d4485220 diff --git a/notmuch.el b/notmuch.el index 70dbe5ba..ed1f7cb5 100644 --- a/notmuch.el +++ b/notmuch.el @@ -62,8 +62,6 @@ (define-key map "a" 'notmuch-show-archive-thread) (define-key map "A" 'notmuch-show-mark-read-then-archive-thread) (define-key map "b" 'notmuch-show-toggle-body-read-visible) - (define-key map "c" 'notmuch-show-toggle-citations-visible) - (define-key map "h" 'notmuch-show-toggle-headers-visible) (define-key map "m" 'message-mail) (define-key map "n" 'notmuch-show-next-message) (define-key map "N" 'notmuch-show-mark-read-then-next-open-message) @@ -72,7 +70,6 @@ (define-key map (kbd "C-p") 'notmuch-show-previous-line) (define-key map "q" 'kill-this-buffer) (define-key map "r" 'notmuch-show-reply) - (define-key map "s" 'notmuch-show-toggle-signatures-visible) (define-key map "v" 'notmuch-show-view-all-mime-parts) (define-key map "w" 'notmuch-show-view-raw-message) (define-key map "x" 'kill-this-buffer) @@ -82,6 +79,8 @@ (define-key map " " 'notmuch-show-advance-marking-read-and-archiving) (define-key map "|" 'notmuch-show-pipe-message) (define-key map "?" 'describe-mode) + (define-key map (kbd "TAB") 'notmuch-show-next-button) + (define-key map (kbd "M-TAB") 'notmuch-show-previous-button) map) "Keymap for \"notmuch show\" buffers.") (fset 'notmuch-show-mode-map notmuch-show-mode-map) @@ -289,6 +288,7 @@ buffer." (defun notmuch-reply (query-string) (switch-to-buffer (generate-new-buffer "notmuch-draft")) (call-process notmuch-command nil t nil "reply" query-string) + (message-insert-signature) (goto-char (point-min)) (if (re-search-forward "^$" nil t) (progn @@ -309,7 +309,8 @@ The given command will be executed with the raw contents of the current email message as stdin. Anything printed by the command to stdout or stderr will appear in the *Messages* buffer." (interactive "sPipe message to command: ") - (apply 'start-process-shell-command "notmuch-pipe-command" "*notmuch-pipe*" (split-string (concat command " < " (notmuch-show-get-filename))))) + (apply 'start-process-shell-command "notmuch-pipe-command" "*notmuch-pipe*" + (list command " < " (shell-quote-argument (notmuch-show-get-filename))))) (defun notmuch-show-move-to-current-message-summary-line () "Move to the beginning of the one-line summary of the current message. @@ -477,13 +478,24 @@ which this thread was originally shown." (if last (notmuch-show-archive-thread)))))) +(defun notmuch-show-next-button () + "Advance point to the next button in the buffer." + (interactive) + (goto-char (button-start (next-button (point))))) + +(defun notmuch-show-previous-button () + "Move point back to the previous button in the buffer." + (interactive) + (goto-char (button-start (previous-button (point))))) + (defun notmuch-toggle-invisible-action (cite-button) (let ((invis-spec (button-get button 'invisibility-spec))) (if (invisible-p invis-spec) (remove-from-invisibility-spec invis-spec) (add-to-invisibility-spec invis-spec) )) - (goto-char (button-end cite-button))) + (force-window-update) + (redisplay t)) (defun notmuch-show-markup-citations-region (beg end depth) (goto-char beg) @@ -511,8 +523,9 @@ which this thread was originally shown." (let ((cite-button (insert-button cite-button-text))) (button-put cite-button 'invisibility-spec invis-spec) (button-put cite-button 'action 'notmuch-toggle-invisible-action) + (button-put cite-button 'follow-link t) (button-put cite-button 'help-echo - "mouse-2, RET: Show citation") + "mouse-1, RET: Show citation") ) (insert "\n") @@ -536,8 +549,9 @@ which this thread was originally shown." (button-put sig-button 'invisibility-spec invis-spec) (button-put sig-button 'action 'notmuch-toggle-invisible-action) + (button-put sig-button 'follow-link t) (button-put sig-button 'help-echo - "mouse-2, RET: Show signature") + "mouse-1, RET: Show signature") ) (insert "\n") (goto-char end)))))) @@ -588,7 +602,8 @@ which this thread was originally shown." (end-of-line) ; Inverse video for subject (overlay-put (make-overlay beg (point)) 'face '(:inverse-video t)) - (forward-line 2) + (forward-line 1) + (end-of-line) (let ((beg-hidden (point-marker))) (re-search-forward notmuch-show-header-end-regexp) (beginning-of-line) @@ -602,8 +617,21 @@ which this thread was originally shown." (forward-line) ) (indent-rigidly beg end depth) - (overlay-put (make-overlay beg-hidden end) - 'invisible 'notmuch-show-header) + (let ((invis-spec (make-symbol "notmuch-show-header"))) + (add-to-invisibility-spec (cons invis-spec t)) + (overlay-put (make-overlay beg-hidden end) + 'invisible invis-spec) + (goto-char beg) + (forward-line) + (let ((header-button (make-button (line-beginning-position) (line-end-position)))) + (button-put header-button 'invisibility-spec (cons invis-spec t)) + (button-put header-button 'action 'notmuch-toggle-invisible-action) + (button-put header-button 'follow-link t) + (button-put header-button 'help-echo + "mouse-1, RET: Show headers") + )) + (goto-char end) + (insert "\n") (set-marker beg nil) (set-marker beg-hidden nil) (set-marker end nil) @@ -635,39 +663,6 @@ which this thread was originally shown." (notmuch-show-markup-message))) (notmuch-show-hide-markers)) -(defun notmuch-show-toggle-citations-visible () - "Toggle visibility of citations" - (interactive) - (if notmuch-show-citations-visible - (add-to-invisibility-spec 'notmuch-show-citation) - (remove-from-invisibility-spec 'notmuch-show-citation)) - (set 'notmuch-show-citations-visible (not notmuch-show-citations-visible)) - ; Need to force the redisplay for some reason - (force-window-update) - (redisplay t)) - -(defun notmuch-show-toggle-signatures-visible () - "Toggle visibility of signatures" - (interactive) - (if notmuch-show-signatures-visible - (add-to-invisibility-spec 'notmuch-show-signature) - (remove-from-invisibility-spec 'notmuch-show-signature)) - (set 'notmuch-show-signatures-visible (not notmuch-show-signatures-visible)) - ; Need to force the redisplay for some reason - (force-window-update) - (redisplay t)) - -(defun notmuch-show-toggle-headers-visible () - "Toggle visibility of header fields" - (interactive) - (if notmuch-show-headers-visible - (add-to-invisibility-spec 'notmuch-show-header) - (remove-from-invisibility-spec 'notmuch-show-header)) - (set 'notmuch-show-headers-visible (not notmuch-show-headers-visible)) - ; Need to force the redisplay for some reason - (force-window-update) - (redisplay t)) - (defun notmuch-show-toggle-body-read-visible () "Toggle visibility of message bodies of read messages" (interactive) @@ -804,6 +799,7 @@ thread from that buffer can be show when done with this one)." (define-key map "t" 'notmuch-search-filter-by-tag) (define-key map "x" 'kill-this-buffer) (define-key map (kbd "RET") 'notmuch-search-show-thread) + (define-key map [mouse-1] 'notmuch-search-show-thread) (define-key map "+" 'notmuch-search-add-tag) (define-key map "-" 'notmuch-search-remove-tag) (define-key map "<" 'beginning-of-buffer) @@ -1066,4 +1062,85 @@ current search results AND that are tagged with the given tag." (setq mail-user-agent 'message-user-agent) +(defvar notmuch-folder-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "n" 'next-line) + (define-key map "p" 'previous-line) + (define-key map "x" 'kill-this-buffer) + (define-key map "q" 'kill-this-buffer) + (define-key map "s" 'notmuch-search) + (define-key map (kbd "RET") 'notmuch-folder-show-search) + (define-key map "<" 'beginning-of-buffer) + (define-key map "=" 'notmuch-folder) + (define-key map "?" 'describe-mode) + (define-key map [mouse-1] 'notmuch-folder-show-search) + map) + "Keymap for \"notmuch folder\" buffers.") + +(fset 'notmuch-folder-mode-map notmuch-folder-mode-map) + +(defcustom notmuch-folders (quote (("inbox" . "tag:inbox") ("unread" . "tag:unread"))) + "List of searches for the notmuch folder view" + :type '(alist :key-type (string) :value-type (string)) + :group 'notmuch) + +(defun notmuch-folder-mode () + "Major mode for showing notmuch 'folders'. + +This buffer contains a list of messages counts returned by a +customizable set of searches of your email archives. Each line +in the buffer shows the search terms and the resulting message count. + +Pressing RET on any line opens a search window containing the +results for the search terms in that line. + +\\{notmuch-folder-mode-map}" + (interactive) + (kill-all-local-variables) + (use-local-map 'notmuch-folder-mode-map) + (setq truncate-lines t) + (hl-line-mode 1) + (setq major-mode 'notmuch-folder-mode + mode-name "notmuch-folder") + (setq buffer-read-only t)) + +(defun notmuch-folder-add (folders) + (if folders + (let ((name (car (car folders))) + (inhibit-read-only t) + (search (cdr (car folders)))) + (insert name) + (indent-to 16 1) + (call-process notmuch-command nil t nil "count" search) + (notmuch-folder-add (cdr folders))))) + +(defun notmuch-folder-find-name () + (save-excursion + (beginning-of-line) + (let ((beg (point))) + (forward-word) + (filter-buffer-substring beg (point))))) + +(defun notmuch-folder-show-search (&optional folder) + "Show a search window for the search related to the specified folder." + (interactive) + (if (null folder) + (setq folder (notmuch-folder-find-name))) + (let ((search (assoc folder notmuch-folders))) + (if search + (notmuch-search (cdr search) t)))) + +(defun notmuch-folder () + "Show the notmuch folder view and update the displayed counts." + (interactive) + (let ((buffer (get-buffer-create "*notmuch-folders*"))) + (switch-to-buffer buffer) + (let ((inhibit-read-only t) + (n (line-number-at-pos))) + (erase-buffer) + (notmuch-folder-mode) + (notmuch-folder-add notmuch-folders) + (goto-char (point-min)) + (goto-line n)))) + (provide 'notmuch)