]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-lib.el
emacs: Introduce `notmuch-call-notmuch-sexp'
[notmuch] / emacs / notmuch-lib.el
index 28f78e0f4337d0623ccb77e3f18f224f9037dead..c82c6c2a63246ede7878fce974d4aa7206c11399 100644 (file)
   :group 'notmuch)
 
 (defcustom notmuch-search-oldest-first t
-  "Show the oldest mail first when searching."
+  "Show the oldest mail first when searching.
+
+This variable defines the default sort order for displaying
+search results. Note that any filtered searches created by
+`notmuch-search-filter' retain the search order of the parent
+search."
   :type 'boolean
   :group 'notmuch-search)
 
@@ -484,6 +489,23 @@ an error."
              (json-read)))
        (delete-file err-file)))))
 
+(defun notmuch-call-notmuch-sexp (&rest args)
+  "Invoke `notmuch-command' with ARGS and return the parsed S-exp output.
+
+If notmuch exits with a non-zero status, this will pop up a
+buffer containing notmuch's output and signal an error."
+
+  (with-temp-buffer
+    (let ((err-file (make-temp-file "nmerr")))
+      (unwind-protect
+         (let ((status (apply #'call-process
+                              notmuch-command nil (list t err-file) nil args)))
+           (notmuch-check-exit-status status (cons notmuch-command args)
+                                      (buffer-string) err-file)
+           (goto-char (point-min))
+           (read (current-buffer)))
+       (delete-file err-file)))))
+
 (defun notmuch-start-notmuch (name buffer sentinel &rest args)
   "Start and return an asynchronous notmuch command.
 
@@ -528,8 +550,12 @@ status."
          (when sub-sentinel
            (funcall sub-sentinel proc event))
          ;; Check the exit status.  This will signal an error if the
-         ;; exit status is non-zero.
-         (notmuch-check-async-exit-status proc event real-command err-file)
+         ;; exit status is non-zero.  Don't do this if the process
+         ;; buffer is dead since that means Emacs killed the process
+         ;; and there's no point in telling the user that (but we
+         ;; still check for and report stderr output below).
+         (when (buffer-live-p (process-buffer proc))
+           (notmuch-check-async-exit-status proc event real-command err-file))
          ;; If that didn't signal an error, then any error output was
          ;; really warning output.  Show warnings, if any.
          (let ((warnings