X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=emacs%2Fnotmuch.el;h=1d8d7da0e8d01528525291503eead73df4562ff0;hb=7135a8bcbf0cf17931af3f017bce81bb557ea1eb;hp=57b7fcf40e0bf790131a2871316fcebdba17adc8;hpb=8cbb5114a20c1217f23977fd5edca99a0b7a2955;p=notmuch diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 57b7fcf4..1d8d7da0 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -54,15 +54,10 @@ (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) - (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: @@ -197,10 +192,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 +201,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) @@ -224,6 +215,7 @@ For a mouse binding, return nil." (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) @@ -241,9 +233,18 @@ For a mouse binding, return nil." (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 +337,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) @@ -590,7 +592,11 @@ 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 ((sample (format (cdr (assoc field notmuch-search-result-format)) ""))) + (if (> (length authors) + (length sample)) + (concat (substring authors 0 (- (length sample) 4)) "... ") + (format (cdr (assoc field notmuch-search-result-format)) authors))))) ((string-equal field "subject") (insert (format (cdr (assoc field notmuch-search-result-format)) subject))) ((string-equal field "tags") @@ -619,12 +625,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) @@ -692,7 +695,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 +713,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 +742,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. @@ -802,6 +835,7 @@ current search results AND that are tagged with the given tag." (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 +949,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."