]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.el
README: Add a simple file explaining notmuch and pointing out resources.
[notmuch] / notmuch.el
index 86b939913a65bd024c6f9f503603fb86923d5d25..cedbdb330568f2a412106e4e6e4e0c2629d61e55 100644 (file)
 ; Authors: Roland McGrath <roland@gnu.org>,
 ;          Daniel Pfeiffer <occitan@esperanto.org>
 
 ; Authors: Roland McGrath <roland@gnu.org>,
 ;          Daniel Pfeiffer <occitan@esperanto.org>
 
+(defvar notmuch-show-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "x" 'kill-this-buffer)
+    map)
+  "Keymap for \"notmuch show\" buffers.")
+(fset 'notmuch-show-mode-map notmuch-show-mode-map)
+
+;;;###autoload
+(defun notmuch-show-mode ()
+  "Major mode for handling the output of \"notmuch show\""
+  (interactive)
+  (kill-all-local-variables)
+  (use-local-map notmuch-show-mode-map)
+  (setq major-mode 'notmuch-show-mode
+       mode-name "notmuch-show")
+  (setq buffer-read-only t))
+
+(defun notmuch-show (thread-id)
+  "Run \"notmuch show\" with the given thread ID and display results."
+  (interactive "sNotmuch show: ")
+  (let ((buffer (get-buffer-create (concat "*notmuch-show-" thread-id "*"))))
+    (switch-to-buffer buffer)
+    (notmuch-show-mode)
+    (let ((proc (get-buffer-process (current-buffer)))
+         (inhibit-read-only t))
+      (if proc
+         (error "notmuch search process already running for query `%s'" query)
+       )
+      (erase-buffer)
+      (beginning-of-buffer)
+      (save-excursion
+       (call-process "notmuch" nil t nil "show" thread-id)
+       )
+      )))
+
+(defvar notmuch-search-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "a" 'notmuch-search-archive-thread)
+    (define-key map "n" 'next-line)
+    (define-key map "p" 'previous-line)
+    (define-key map "\r" 'notmuch-search-show-thread)
+    (define-key map "+" 'notmuch-search-add-tag)
+    (define-key map "-" 'notmuch-search-remove-tag)
+    map)
+  "Keymap for \"notmuch search\" buffers.")
+(fset 'notmuch-search-mode-map notmuch-search-mode-map)
+
 ;;;###autoload
 (defun notmuch-search-mode ()
 ;;;###autoload
 (defun notmuch-search-mode ()
-  "Major mode for handling the output of notmuch search"
+  "Major mode for handling the output of \"notmuch search\""
   (interactive)
   (kill-all-local-variables)
   (interactive)
   (kill-all-local-variables)
+  (use-local-map notmuch-search-mode-map)
   (setq major-mode 'notmuch-search-mode
        mode-name "notmuch-search")
   (setq buffer-read-only t))
 
   (setq major-mode 'notmuch-search-mode
        mode-name "notmuch-search")
   (setq buffer-read-only t))
 
+(defun notmuch-search-find-thread-id ()
+  (save-excursion
+    (beginning-of-line)
+    (let ((beg (point)))
+      (re-search-forward "[a-fA-F0-9]*")
+      (filter-buffer-substring beg (point)))))
+
+(defun notmuch-search-show-thread ()
+  (interactive)
+  (notmuch-show (notmuch-search-find-thread-id)))
+
+(defun notmuch-search-call-notmuch-process (&rest args)
+  (let ((error-buffer (get-buffer-create "*Notmuch errors*")))
+    (with-current-buffer error-buffer
+       (erase-buffer))
+    (if (eq (apply 'call-process "notmuch" nil error-buffer nil args) 0)
+       (point)
+      (progn
+       (with-current-buffer error-buffer
+         (let ((beg (point-min))
+               (end (- (point-max) 1)))
+           (error (buffer-substring beg end))
+           ))))))
+
+(defun notmuch-search-add-tag (tag)
+  (interactive "sTag to add: ")
+  (notmuch-search-call-notmuch-process "tag" (concat "+" tag) (concat "thread:" (notmuch-search-find-thread-id))))
+
+(defun notmuch-search-remove-tag (tag)
+  (interactive "sTag to remove: ")
+  (notmuch-search-call-notmuch-process "tag" (concat "-" tag) (concat "thread:" (notmuch-search-find-thread-id))))
+
+(defun notmuch-search-archive-thread ()
+  (interactive)
+  (notmuch-search-remove-tag "inbox"))
+
 (defun notmuch-search (query)
   "Run \"notmuch search\" with the given query string and display results."
   (interactive "sNotmuch search: ")
 (defun notmuch-search (query)
   "Run \"notmuch search\" with the given query string and display results."
   (interactive "sNotmuch search: ")
-  (let ((buffer (get-buffer-create (concat "*notmuch-search-" query))))
+  (let ((buffer (get-buffer-create (concat "*notmuch-search-" query "*"))))
     (switch-to-buffer buffer)
     (switch-to-buffer buffer)
-    (setq buffer-read-only t)
+    (notmuch-search-mode)
     (let ((proc (get-buffer-process (current-buffer)))
          (inhibit-read-only t))
       (if proc
     (let ((proc (get-buffer-process (current-buffer)))
          (inhibit-read-only t))
       (if proc
 (defun notmuch ()
   "Run notmuch to display all mail with tag of 'inbox'"
   (interactive)
 (defun notmuch ()
   "Run notmuch to display all mail with tag of 'inbox'"
   (interactive)
-  (require 'compile)
   (notmuch-search "tag:inbox"))
   (notmuch-search "tag:inbox"))
+
+(provide 'notmuch)