X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=emacs%2Fnotmuch.el;h=e20718018a05cd0040f048e4c01ba3cc9f874571;hb=975307c945575bc660b451d13291956271e92e93;hp=57b7fcf40e0bf790131a2871316fcebdba17adc8;hpb=38c595738f229eda659853df34dee05cf618556c;p=notmuch diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 57b7fcf4..e2071801 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -53,16 +53,13 @@ (require 'notmuch-lib) (require 'notmuch-show) - -(defcustom notmuch-search-authors-width 20 - "Number of columns to use to display authors in a notmuch-search buffer." - :type 'integer - :group 'notmuch) +(require 'notmuch-mua) +(require 'notmuch-hello) (defcustom notmuch-search-result-format `(("date" . "%s ") ("count" . "%-7s ") - ("authors" . ,(format "%%-%ds " notmuch-search-authors-width)) + ("authors" . "%-20s ") ("subject" . "%s ") ("tags" . "(%s)")) "Search result formating. Supported fields are: @@ -116,17 +113,6 @@ For example: (mm-save-part p)))) mm-handle)) -(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 - (insert "--text follows this line--") - (forward-line))) - (message-mode)) - (defun notmuch-documentation-first-line (symbol) "Return the first line of the documentation string for SYMBOL." (let ((doc (documentation symbol))) @@ -197,10 +183,6 @@ For a mouse binding, return nil." (set-buffer-modified-p nil) (view-buffer (current-buffer) 'kill-buffer-if-not-modified)))) -(defgroup notmuch nil - "Notmuch mail reader for Emacs." - :group 'mail) - (defcustom notmuch-search-hook '(hl-line-mode) "List of functions to call when notmuch displays the search results." :type 'hook @@ -210,8 +192,8 @@ For a mouse binding, return nil." (defvar notmuch-search-mode-map (let ((map (make-sparse-keymap))) (define-key map "?" 'notmuch-help) - (define-key map "q" 'kill-this-buffer) - (define-key map "x" 'kill-this-buffer) + (define-key map "q" 'notmuch-search-quit) + (define-key map "x" 'notmuch-search-quit) (define-key map (kbd "") 'notmuch-search-scroll-down) (define-key map "b" 'notmuch-search-scroll-down) (define-key map " " 'notmuch-search-scroll-up) @@ -220,10 +202,11 @@ For a mouse binding, return nil." (define-key map "p" 'notmuch-search-previous-thread) (define-key map "n" 'notmuch-search-next-thread) (define-key map "r" 'notmuch-search-reply-to-thread) - (define-key map "m" 'message-mail) + (define-key map "m" 'notmuch-mua-mail) (define-key map "s" 'notmuch-search) (define-key map "o" 'notmuch-search-toggle-order) (define-key map "=" 'notmuch-search-refresh-view) + (define-key map "G" 'notmuch-search-poll-and-refresh-view) (define-key map "t" 'notmuch-search-filter-by-tag) (define-key map "f" 'notmuch-search-filter) (define-key map [mouse-1] 'notmuch-search-show-thread) @@ -239,11 +222,18 @@ For a mouse binding, return nil." (defvar notmuch-search-query-string) (defvar notmuch-search-target-thread) (defvar notmuch-search-target-line) -(defvar notmuch-search-oldest-first t - "Show the oldest mail first in the search-mode") +(defvar notmuch-search-continuation) (defvar notmuch-search-disjunctive-regexp "\\<[oO][rR]\\>") +(defun notmuch-search-quit () + "Exit the search buffer, calling any defined continuation function." + (interactive) + (let ((continuation notmuch-search-continuation)) + (kill-this-buffer) + (when continuation + (funcall continuation)))) + (defun notmuch-search-scroll-up () "Move forward through search results by one window's worth." (interactive) @@ -336,6 +326,7 @@ Complete list of currently available key bindings: (make-local-variable 'notmuch-search-oldest-first) (make-local-variable 'notmuch-search-target-thread) (make-local-variable 'notmuch-search-target-line) + (set (make-local-variable 'notmuch-search-continuation) nil) (set (make-local-variable 'scroll-preserve-screen-position) t) (add-to-invisibility-spec 'notmuch-search) (use-local-map notmuch-search-mode-map) @@ -403,7 +394,7 @@ Complete list of currently available key bindings: "Begin composing a reply to the entire current thread in a new buffer." (interactive) (let ((message-id (notmuch-search-find-thread-id))) - (notmuch-reply message-id))) + (notmuch-mua-reply message-id))) (defun notmuch-call-notmuch-process (&rest args) "Synchronously invoke \"notmuch\" with the given list of arguments. @@ -590,7 +581,13 @@ matching will be applied." ((string-equal field "count") (insert (format (cdr (assoc field notmuch-search-result-format)) count))) ((string-equal field "authors") - (insert (format (cdr (assoc field notmuch-search-result-format)) authors))) + (insert (let* ((format-string (cdr (assoc field notmuch-search-result-format))) + (formatted-sample (format format-string "")) + (formatted-authors (format format-string authors))) + (if (> (length formatted-authors) + (length formatted-sample)) + (concat (substring authors 0 (- (length formatted-sample) 4)) "... ") + formatted-authors)))) ((string-equal field "subject") (insert (format (cdr (assoc field notmuch-search-result-format)) subject))) ((string-equal field "tags") @@ -619,12 +616,9 @@ matching will be applied." (date (match-string 2 string)) (count (match-string 3 string)) (authors (match-string 4 string)) - (authors-length (length authors)) (subject (match-string 5 string)) (tags (match-string 6 string)) (tag-list (if tags (save-match-data (split-string tags))))) - (if (> authors-length notmuch-search-authors-width) - (set 'authors (concat (substring authors 0 (- notmuch-search-authors-width 3)) "..."))) (goto-char (point-max)) (let ((beg (point-marker))) (notmuch-search-show-result date count authors subject tags) @@ -665,11 +659,6 @@ characters as well as `_.+-'. (apply 'notmuch-call-notmuch-process "tag" (append action-split (list notmuch-search-query-string) nil)))) -(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-search-buffer-title (query) "Returns the title for a buffer with notmuch search results." (let* ((folder (rassoc-if (lambda (key) @@ -692,7 +681,7 @@ characters as well as `_.+-'. ))) ;;;###autoload -(defun notmuch-search (query &optional oldest-first target-thread target-line) +(defun notmuch-search (query &optional oldest-first target-thread target-line continuation) "Run \"notmuch search\" with the given query string and display results. The optional parameters are used as follows: @@ -710,6 +699,7 @@ The optional parameters are used as follows: (set 'notmuch-search-oldest-first oldest-first) (set 'notmuch-search-target-thread target-thread) (set 'notmuch-search-target-line target-line) + (set 'notmuch-search-continuation continuation) (let ((proc (get-buffer-process (current-buffer))) (inhibit-read-only t)) (if proc @@ -738,11 +728,40 @@ same relative position within the new buffer." (let ((target-line (line-number-at-pos)) (oldest-first notmuch-search-oldest-first) (target-thread (notmuch-search-find-thread-id)) - (query notmuch-search-query-string)) + (query notmuch-search-query-string) + (continuation notmuch-search-continuation)) (kill-this-buffer) - (notmuch-search query oldest-first target-thread target-line) - (goto-char (point-min)) - )) + (notmuch-search query oldest-first target-thread target-line continuation) + (goto-char (point-min)))) + +(defcustom notmuch-poll-script "" + "An external script to incorporate new mail into the notmuch database. + +If this variable is non empty, then it should name a script to be +invoked by `notmuch-search-poll-and-refresh-view' and +`notmuch-folder-poll-and-refresh-view' (each have a default +keybinding of 'G'). The script could do any of the following +depending on the user's needs: + +1. Invoke a program to transfer mail to the local mail store +2. Invoke \"notmuch new\" to incorporate the new mail +3. Invoke one or more \"notmuch tag\" commands to classify the mail" + :type 'string + :group 'notmuch) + +(defun notmuch-poll () + "Run external script to import mail. + +Invokes `notmuch-poll-script' if it is not set to an empty string." + (interactive) + (if (not (string= notmuch-poll-script "")) + (call-process notmuch-poll-script nil nil))) + +(defun notmuch-search-poll-and-refresh-view () + "Invoke `notmuch-poll' to import mail, then refresh the current view." + (interactive) + (notmuch-poll) + (notmuch-search-refresh-view)) (defun notmuch-search-toggle-order () "Toggle the current search order. @@ -786,22 +805,23 @@ current search results AND that are tagged with the given tag." ;;;###autoload (defun notmuch () - "Run notmuch to display all mail with tag of 'inbox'" + "Run notmuch and display saved searches, known tags, etc." (interactive) - (notmuch-search "tag:inbox" notmuch-search-oldest-first)) + (notmuch-hello)) -(setq mail-user-agent 'message-user-agent) +(setq mail-user-agent 'notmuch-user-agent) (defvar notmuch-folder-mode-map (let ((map (make-sparse-keymap))) (define-key map "?" 'notmuch-help) (define-key map "x" 'kill-this-buffer) (define-key map "q" 'kill-this-buffer) - (define-key map "m" 'message-mail) + (define-key map "m" 'notmuch-mua-mail) (define-key map "e" 'notmuch-folder-show-empty-toggle) (define-key map ">" 'notmuch-folder-last) (define-key map "<" 'notmuch-folder-first) (define-key map "=" 'notmuch-folder) + (define-key map "G" 'notmuch-folder-poll-and-refresh-view) (define-key map "s" 'notmuch-search) (define-key map [mouse-1] 'notmuch-folder-show-search) (define-key map (kbd "RET") 'notmuch-folder-show-search) @@ -915,6 +935,12 @@ Currently available key bindings: (if search (notmuch-search (cdr search) notmuch-search-oldest-first)))) +(defun notmuch-folder-poll-and-refresh-view () + "Invoke `notmuch-poll' to import mail, then refresh the folder view." + (interactive) + (notmuch-poll) + (notmuch-folder)) + ;;;###autoload (defun notmuch-folder () "Show the notmuch folder view and update the displayed counts."