X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.el;h=8aee2864047ef455ff3e7eb1e83693ee9e557829;hp=763c85fffe7971cdf011299315274e7072db6bea;hb=bde9284064e71e88ba68718c14b9697a98873adb;hpb=b38bd7efd83a8b7ea2c961060d8007efa055b9b6 diff --git a/notmuch.el b/notmuch.el index 763c85ff..8aee2864 100644 --- a/notmuch.el +++ b/notmuch.el @@ -82,6 +82,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 +291,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 +312,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 +481,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 +526,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 +552,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,14 +605,36 @@ 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) (let ((end (point-marker))) + (goto-char beg) + (forward-line) + (while (looking-at "[A-Za-z][-A-Za-z0-9]*:") + (beginning-of-line) + (overlay-put (make-overlay (point) (re-search-forward ":")) + 'face 'bold) + (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) @@ -796,6 +835,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) @@ -1058,4 +1098,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)