]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-maildir-fcc.el
cli: implement structured output version 4
[notmuch] / emacs / notmuch-maildir-fcc.el
index cda51e7f3d07072b0c9ecdb7e0669bac34155745..1551e8b649102ccdfecad9a2ef278949bfb3d702 100644 (file)
 (defvar notmuch-maildir-fcc-count 0)
 
 (defcustom notmuch-fcc-dirs "sent"
- "Determines the maildir directory in which to save outgoing mail.
+ "Determines the Fcc Header which says where to save outgoing mail.
 
 Three types of values are permitted:
 
 - nil: no Fcc header is added,
 
-- a string: the value of `notmuch-fcc-dirs' is the name of the
-  folder to use,
+- a string: the value of `notmuch-fcc-dirs' is the Fcc header to
+  be used.
 
 - a list: the folder is chosen based on the From address of the
   current message using a list of regular expressions and
@@ -50,12 +50,23 @@ Three types of values are permitted:
   If none of the regular expressions match the From address, no
   Fcc header will be added.
 
-In all cases, a relative FCC directory will be understood to
-specify a directory within the notmuch mail store, (as set by
-the database.path option in the notmuch configuration file).
+If `notmuch-maildir-use-notmuch-insert' is set (the default) then
+the header should be of the form \"folder +tag1 -tag2\" where
+folder is the folder (relative to the notmuch mailstore) to store
+the message in, and tag1 and tag2 are tag changes to apply to the
+stored message. This string is split using `split-string-and-unquote',
+so a folder name containing spaces can be specified by
+quoting each space with an immediately preceding backslash
+or surrounding the entire folder name in double quotes.
 
-You will be prompted to create the directory if it does not exist
-yet when sending a mail."
+If `notmuch-maildir-use-notmuch-insert' is nil then the Fcc
+header should be the directory where the message should be
+saved. A relative directory will be understood to specify a
+directory within the notmuch mail store, (as set by the
+database.path option in the notmuch configuration file).
+
+In all cases you will be prompted to create the folder or
+directory if it does not exist yet when sending a mail."
 
  :type '(choice
         (const :tag "No FCC header" nil)
@@ -65,6 +76,12 @@ yet when sending a mail."
  :require 'notmuch-fcc-initialization
  :group 'notmuch-send)
 
+(defcustom notmuch-maildir-use-notmuch-insert 't
+  "Should fcc use notmuch insert instead of simple fcc"
+  :type '(choice :tag "Fcc Method"
+                (const :tag "Use notmuch insert" t)
+                (const :tag "Use simple fcc" nil))
+  :group 'notmuch-send)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Functions which set up the fcc header in the message buffer.
@@ -108,7 +125,18 @@ by notmuch-mua-mail"
           (error "Invalid `notmuch-fcc-dirs' setting (neither string nor list)")))))
 
     (when subdir
-      (notmuch-maildir-add-file-style-fcc-header subdir))))
+      (if notmuch-maildir-use-notmuch-insert
+         (notmuch-maildir-add-notmuch-insert-style-fcc-header subdir)
+       (notmuch-maildir-add-file-style-fcc-header subdir)))))
+
+(defun notmuch-maildir-add-notmuch-insert-style-fcc-header (subdir)
+  ;; Notmuch insert does not accept absolute paths, so check the user
+  ;; really want this header inserted.
+
+  (when (or (not (= (elt subdir 0) ?/))
+           (y-or-n-p (format "Fcc header %s is an absolute path and notmuch insert is requested.\nInsert header anyway? "
+                             subdir)))
+    (message-add-header (concat "Fcc: " subdir))))
 
 (defun notmuch-maildir-add-file-style-fcc-header (subdir)
   (message-add-header
@@ -173,8 +201,64 @@ This is a rearranged version of message mode's message-do-fcc."
         (kill-buffer (current-buffer)))))))
 
 (defun notmuch-fcc-handler (fcc-header)
-  "Store message with file fcc."
-  (notmuch-maildir-fcc-file-fcc fcc-header))
+  "Store message with notmuch insert or normal (file) fcc.
+
+If `notmuch-maildir-use-notmuch-insert` is set then store the
+message using notmuch insert. Otherwise store the message using
+normal fcc."
+  (message "Doing Fcc...")
+  (if notmuch-maildir-use-notmuch-insert
+      (notmuch-maildir-fcc-with-notmuch-insert fcc-header)
+    (notmuch-maildir-fcc-file-fcc fcc-header)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Functions for saving a message using notmuch insert.
+
+(defun notmuch-maildir-notmuch-insert-current-buffer (folder &optional create tags)
+  "Use notmuch insert to put the current buffer in the database.
+
+This inserts the current buffer as a message into the notmuch
+database in folder FOLDER. If CREATE is non-nil it will supply
+the --create-folder flag to create the folder if necessary. TAGS
+should be a list of tag changes to apply to the inserted message."
+  (let* ((args (append (when create (list "--create-folder"))
+                      (list (concat "--folder=" folder))
+                      tags)))
+    (apply 'notmuch-call-notmuch-process
+          :stdin-string (buffer-string) "insert" args)))
+
+(defun notmuch-maildir-fcc-with-notmuch-insert (fcc-header &optional create)
+  "Store message with notmuch insert.
+
+The fcc-header should be of the form \"folder +tag1 -tag2\" where
+folder is the folder (relative to the notmuch mailstore) to store
+the message in, and tag1 and tag2 are tag changes to apply to the
+stored message. This string is split using `split-string-and-unquote',
+so a folder name containing spaces can be specified by
+quoting each space with an immediately preceding backslash
+or surrounding the entire folder name in double quotes.
+
+If CREATE is non-nil then create the folder if necessary."
+  (let* ((args (split-string-and-unquote fcc-header))
+        (folder (car args))
+        (tags (cdr args)))
+    (condition-case nil
+       (notmuch-maildir-notmuch-insert-current-buffer folder create tags)
+      ;; Since there are many reasons notmuch insert could fail, e.g.,
+      ;; locked database, non-existent folder (which could be due to a
+      ;; typo, or just the user want a new folder, let the user decide
+      ;; how to deal with it.
+      (error
+       (let ((response (notmuch-read-char-choice
+                       "Insert failed: (r)etry, (c)reate folder, (i)gnore, or (e)dit the header? "
+                       '(?r ?c ?i ?e))))
+        (case response
+              (?r (notmuch-maildir-fcc-with-notmuch-insert fcc-header))
+              (?c (notmuch-maildir-fcc-with-notmuch-insert fcc-header 't))
+              (?i 't)
+              (?e (notmuch-maildir-fcc-with-notmuch-insert
+                   (read-from-minibuffer "Fcc header: " fcc-header)))))))))
+
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Functions for saving a message using file fcc.
@@ -192,7 +276,7 @@ This is a rearranged version of message mode's message-do-fcc."
 (defun notmuch-maildir-fcc-make-uniq-maildir-id ()
    (let* ((ftime (float-time))
          (microseconds (mod (* 1000000 ftime) 1000000))
-         (hostname (notmuch-maildir-fcc-host-fixer system-name)))
+         (hostname (notmuch-maildir-fcc-host-fixer (system-name))))
      (setq notmuch-maildir-fcc-count (+ notmuch-maildir-fcc-count 1))
      (format "%d.%d_%d_%d.%s"
             ftime
@@ -251,7 +335,7 @@ if needed."
     ;; fix it in some way.
     (let* ((prompt (format "Fcc %s is not a maildir: (r)etry, (c)reate folder, (i)gnore, or  (e)dit the header? "
                           fcc-header))
-           (response (read-char-choice prompt '(?r ?c ?i ?e))))
+           (response (notmuch-read-char-choice prompt '(?r ?c ?i ?e))))
         (case response
               (?r (notmuch-maildir-fcc-file-fcc fcc-header))
               (?c (if (file-writable-p fcc-header)