X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.el;h=9247cdd50cb6e8be73b87e1aee5e99ac27b444b6;hp=4b2936a9645b980b8654ec71788e010c17ab3c0b;hb=03fd69322b1583e1a05007d303d9fd15a54a02af;hpb=dbb29a77fa63f42a237ce25ea18e4db493e3464c diff --git a/notmuch.el b/notmuch.el index 4b2936a9..9247cdd5 100644 --- a/notmuch.el +++ b/notmuch.el @@ -19,6 +19,34 @@ ; ; Authors: Carl Worth +; This is an emacs-based interface to the notmuch mail system. +; +; You will first need to have the notmuch program installed and have a +; notmuch database built in order to use this. See +; http://notmuchmail.org for details. +; +; To install this software, copy it to a directory that is on the +; `load-path' variable within emacs (a good candidate is +; /usr/local/share/emacs/site-lisp). If you are viewing this from the +; notmuch source distribution then you can simply run: +; +; sudo make install-emacs +; +; to install it. +; +; Then, to actually run it, add: +; +; (require 'notmuch) +; +; to your ~/.emacs file, and then run "M-x notmuch" from within emacs, +; or run: +; +; emacs -f notmuch +; +; Have fun, and let us know if you have any comment, questions, or +; kudos: Notmuch list (subscription is not +; required, but is available from http://notmuchmail.org). + (require 'cl) (require 'mm-view) @@ -74,22 +102,28 @@ pattern can still test against the entire line).") (defvar notmuch-command "notmuch" "Command to run the notmuch binary.") -(set 'notmuch-show-message-begin-regexp "\fmessage{") -(set 'notmuch-show-message-end-regexp "\fmessage}") -(set 'notmuch-show-header-begin-regexp "\fheader{") -(set 'notmuch-show-header-end-regexp "\fheader}") -(set 'notmuch-show-body-begin-regexp "\fbody{") -(set 'notmuch-show-body-end-regexp "\fbody}") -(set 'notmuch-show-attachment-begin-regexp "\fattachment{") -(set 'notmuch-show-attachment-end-regexp "\fattachment}") -(set 'notmuch-show-part-begin-regexp "\fpart{") -(set 'notmuch-show-part-end-regexp "\fpart}") -(set 'notmuch-show-marker-regexp "\f\\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$") - -(set 'notmuch-show-id-regexp "\\(id:[^ ]*\\)") -(set 'notmuch-show-depth-regexp " depth:\\([0-9]*\\) ") -(set 'notmuch-show-filename-regexp "filename:\\(.*\\)$") -(set 'notmuch-show-tags-regexp "(\\([^)]*\\))$") +(defvar notmuch-show-message-begin-regexp "\fmessage{") +(defvar notmuch-show-message-end-regexp "\fmessage}") +(defvar notmuch-show-header-begin-regexp "\fheader{") +(defvar notmuch-show-header-end-regexp "\fheader}") +(defvar notmuch-show-body-begin-regexp "\fbody{") +(defvar notmuch-show-body-end-regexp "\fbody}") +(defvar notmuch-show-attachment-begin-regexp "\fattachment{") +(defvar notmuch-show-attachment-end-regexp "\fattachment}") +(defvar notmuch-show-part-begin-regexp "\fpart{") +(defvar notmuch-show-part-end-regexp "\fpart}") +(defvar notmuch-show-marker-regexp "\f\\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$") + +(defvar notmuch-show-id-regexp "\\(id:[^ ]*\\)") +(defvar notmuch-show-depth-regexp " depth:\\([0-9]*\\) ") +(defvar notmuch-show-filename-regexp "filename:\\(.*\\)$") +(defvar notmuch-show-tags-regexp "(\\([^)]*\\))$") + +(defvar notmuch-show-parent-buffer nil) +(defvar notmuch-show-body-read-visible nil) +(defvar notmuch-show-citations-visible nil) +(defvar notmuch-show-signatures-visible nil) +(defvar notmuch-show-headers-visible nil) ; XXX: This should be a generic function in emacs somewhere, not here (defun point-invisible-p () @@ -275,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. @@ -443,6 +478,15 @@ which this thread was originally shown." (if last (notmuch-show-archive-thread)))))) +(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) + )) + (force-window-update) + (redisplay t)) + (defun notmuch-show-markup-citations-region (beg end depth) (goto-char beg) (beginning-of-line) @@ -454,25 +498,53 @@ which this thread was originally shown." (progn (while (looking-at citation) (forward-line)) - (let ((overlay (make-overlay beg-sub (point)))) - (overlay-put overlay 'invisible 'notmuch-show-citation) - (overlay-put overlay 'before-string - (concat indent - "[" (number-to-string (count-lines beg-sub (point))) - "-line citation. Press 'c' to show.]\n"))))) + (let ((overlay (make-overlay beg-sub (point))) + (invis-spec (make-symbol "notmuch-citation-region"))) + (add-to-invisibility-spec invis-spec) + (overlay-put overlay 'invisible invis-spec) + (let ( + (p (point)) + (cite-button-text + (concat "[" (number-to-string (count-lines beg-sub (point))) + "-line citation.]")) + ) + (goto-char (- beg-sub 1)) + (insert (concat "\n" indent)) + (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-1, RET: Show citation") + + ) + (insert "\n") + (goto-char (+ (length cite-button-text) p)) + )))) (move-to-column depth) (if (looking-at notmuch-show-signature-regexp) (let ((sig-lines (- (count-lines beg-sub end) 1))) (if (<= sig-lines notmuch-show-signature-lines-max) (progn - (overlay-put (make-overlay beg-sub end) - 'invisible 'notmuch-show-signature) - (overlay-put (make-overlay beg (- beg-sub 1)) - 'after-string - (concat "\n" indent - "[" (number-to-string sig-lines) - "-line signature. Press 's' to show.]")) - (goto-char end))))) + (let ((invis-spec (make-symbol "notmuch-signature-region"))) + (add-to-invisibility-spec invis-spec) + (overlay-put (make-overlay beg-sub end) + 'invisible invis-spec) + + (goto-char (- beg-sub 1)) + (insert (concat "\n" indent)) + (let ((sig-button (insert-button + (concat "[" (number-to-string sig-lines) + "-line signature.]")))) + (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-1, RET: Show signature") + ) + (insert "\n") + (goto-char end)))))) (forward-line)))) (defun notmuch-show-markup-part (beg end depth) @@ -519,15 +591,25 @@ which this thread was originally shown." (let ((beg (point-marker))) (end-of-line) ; Inverse video for subject - (overlay-put (make-overlay beg (point)) 'face '((cons :inverse-video t))) + (overlay-put (make-overlay beg (point)) 'face '(:inverse-video t)) (forward-line 2) (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) + (goto-char end) + (insert "\n") (set-marker beg nil) (set-marker beg-hidden nil) (set-marker end nil) @@ -688,7 +770,7 @@ thread from that buffer can be show when done with this one)." (let ((proc (get-buffer-process (current-buffer))) (inhibit-read-only t)) (if proc - (error "notmuch search process already running for query `%s'" query) + (error "notmuch search process already running for query `%s'" thread-id) ) (erase-buffer) (goto-char (point-min)) @@ -741,6 +823,9 @@ thread from that buffer can be show when done with this one)." "Keymap for \"notmuch search\" buffers.") (fset 'notmuch-search-mode-map notmuch-search-mode-map) +(defvar notmuch-search-query-string) +(defvar notmuch-search-oldest-first) + (defun notmuch-search-scroll-up () "Scroll up, moving point to last message in thread if at end." (interactive) @@ -763,10 +848,10 @@ thread from that buffer can be show when done with this one)." (goto-char (window-start)) (scroll-down nil))) -(defun notmuch-search-goto-last-thread (&optional arg) +(defun notmuch-search-goto-last-thread () "Move point to the last thread in the buffer." - (interactive "^P") - (end-of-buffer arg) + (interactive) + (goto-char (point-max)) (forward-line -1)) ;;;###autoload