diff --git a/oni-notmuch.el b/oni-notmuch.el index a930469..54c8148 100644 --- a/oni-notmuch.el +++ b/oni-notmuch.el @@ -4,7 +4,7 @@ ;; Author: Tom Willemse ;; Keywords: local -;; Version: 2023.0622.163614 +;; Version: 2023.0720.222735 ;; Package-Requires: (oni-sendmail notmuch ol-notmuch) ;; This program is free software; you can redistribute it and/or modify @@ -28,6 +28,7 @@ (require 'notmuch) (require 'oni-sendmail) +(require 'shell) (defun oni-notmuch-search-delete-thread (&optional reverse begin end) "Archive and mark all messages in the selected threads for deletion. @@ -38,12 +39,39 @@ in which to mark thread." (notmuch-search-archive-thread reverse begin end) (notmuch-search-tag (notmuch-tag-change-list '("deleted") reverse) begin end)) +;;; Needs to be available at both run-time and compile-time so that the call to +;;; the ‘rx’ ‘eval’ construct can evaluate the value at compile-time. +(eval-and-compile + (defconst oni-notmuch-notmuch-new-buffer-name "*notmuch-new*")) + +(defun oni-notmuch-notmuch-new-process-sentinel (process signal) + "Check the status of PROCESS and close its window if it succeeded. +Display SIGNAL when the process has finished and refresh the +‘*notmuch-hello*’ buffer." + (and-let* ((succeeded (equal (process-status process) 'exit)) + (process-window (get-buffer-window (process-buffer process)))) + (delete-window process-window)) + (when (memq (process-status process) '(exit signal)) + (message "%s: %s" + (caddr (process-command process)) + (substring signal 0 -1)) + (when-let ((buffer (get-buffer "*notmuch-hello*"))) + (with-current-buffer buffer + (notmuch-refresh-this-buffer))))) + (defun oni-notmuch-hello-insert-notmuch-command () "Insert a button to run the notmuch command to synchronize mail." (widget-insert "Sync email: ") (widget-create 'push-button :notify (lambda (&rest _) - (async-shell-command "notmuch new")) + (let ((process (start-process-shell-command "notmuch-new" oni-notmuch-notmuch-new-buffer-name "notmuch new"))) + (with-current-buffer (process-buffer process) + (erase-buffer) + (shell-mode) + (setq-local mode-line-format nil)) + (set-process-sentinel process #'oni-notmuch-notmuch-new-process-sentinel) + (set-process-filter process #'comint-output-filter) + (display-buffer (process-buffer process)))) "sync") (widget-insert "\n")) @@ -52,6 +80,13 @@ in which to mark thread." (add-to-list 'notmuch-search-line-faces '("deleted" . (:foreground "#3f4242"))) +(add-to-list 'display-buffer-alist + (cons (rx bos (eval oni-notmuch-notmuch-new-buffer-name) eos) + '(display-buffer-in-side-window + (side . bottom) + (slot . 0) + (window-height . 5)))) + (setf (cdr notmuch-hello-sections) (cons 'oni-notmuch-hello-insert-notmuch-command (cdr notmuch-hello-sections)))