branch: elpa/org-mime
commit 32e317bc18ba14fb327c8b4c0e452558e1bc0238
Author: Kristoffer Balintona <[email protected]>
Commit: Kristoffer Balintona <[email protected]>

    feat: Allow simultaneous editing of multiple `org-mime-src-mode` buffers
    
    Currently, calling `org-mime-edit-mail-in-org-mode' in multiple email
    composition buffers simultaneously results in the text of the last of
    those buffers to be the saved to the email composition buffers.
    
    The cause was that `org-mime-src--overlay`,
    `org-mime-src--beg-marker`, `org-mime-src--end-marker`, and
    `org-mime--saved-temp-window-config` were not buffer local, meaning
    every new `org-mime-src-mode` buffer overwrote the values relevant to
    previous `org-mime-src-mode` buffers.
    
    Therefore, make those variables buffer local and set them in the
    initial email composition buffer.
---
 org-mime.el | 48 +++++++++++++++++++++++++++++-------------------
 1 file changed, 29 insertions(+), 19 deletions(-)

diff --git a/org-mime.el b/org-mime.el
index 53d0f0a4dbb..785deecfc23 100644
--- a/org-mime.el
+++ b/org-mime.el
@@ -252,10 +252,17 @@ buffer holding the text to be exported.")
   "Enable debug logger.")
 
 ;; internal variables
-(defvar org-mime-src--overlay nil)
-(defvar org-mime-src--beg-marker nil)
-(defvar org-mime-src--end-marker nil)
-(defvar org-mime--saved-temp-window-config nil)
+(defvar-local org-mime-src--overlay nil)
+(put 'org-mime-src--overlay 'permanent-local t)
+
+(defvar-local org-mime-src--beg-marker nil)
+(put 'org-mime-src--beg-marker 'permanent-local t)
+
+(defvar-local org-mime-src--end-marker nil)
+(put 'org-mime-src--end-marker 'permanent-local t)
+
+(defvar-local org-mime--saved-temp-window-config nil)
+(put 'org-mime--saved-temp-window-config 'permanent-local t)
 
 (defun org-mime-get-buffer-export-options ()
   "Get export options in buffer."
@@ -846,9 +853,7 @@ Following headline properties can determine the mail 
headers.
          (source-buffer (marker-buffer beg)))
     (org-mime-edit-src-save)
     (unless source-buffer (error "Source buffer disappeared.  Aborting"))
-    ;; Insert modified code.  Ensure it ends with a newline character.
-    (kill-buffer edit-buffer)
-
+    
     ;; to the beginning of the block opening line.
     (goto-char beg)
 
@@ -856,8 +861,13 @@ Following headline properties can determine the mail 
headers.
     (set-marker beg nil)
     (set-marker end nil)
     (when org-mime--saved-temp-window-config
-      (set-window-configuration org-mime--saved-temp-window-config)
-      (setq org-mime--saved-temp-window-config nil))))
+      (unwind-protect
+          (set-window-configuration org-mime--saved-temp-window-config)
+        (setq org-mime--saved-temp-window-config nil)))
+
+    ;; After everything is cleaned up and the window configuration is
+    ;; restored, kill the edit buffer
+    (kill-buffer edit-buffer)))
 
 (defvar org-mime-src-mode-map
   (let ((map (make-sparse-keymap)))
@@ -892,20 +902,13 @@ Following headline properties can determine the mail 
headers.
    ((eq major-mode 'org-mode)
     (message "This command is not for `org-mode'."))
    (t
-    (setq org-mime--saved-temp-window-config (current-window-configuration))
-    (let* ((beg (copy-marker (org-mime-mail-body-begin)))
+    (let* ((window-config (current-window-configuration))
+           (beg (copy-marker (org-mime-mail-body-begin)))
            (end (copy-marker (or (org-mime-mail-signature-begin) (point-max)) 
t))
            (bufname "OrgMimeMailBody")
            (buffer (generate-new-buffer bufname))
            (overlay (org-mime-src--make-source-overlay beg end))
            (text (buffer-substring-no-properties beg end)))
-
-      (setq org-mime-src--beg-marker beg)
-      (setq org-mime-src--end-marker end)
-      ;; don't use local-variable because only user can't edit multiple emails
-      ;; or multiple embedded org code in one mail
-      (setq org-mime-src--overlay overlay)
-
       (save-excursion
         (delete-other-windows)
         (org-switch-to-buffer-other-window buffer)
@@ -914,7 +917,14 @@ Following headline properties can determine the mail 
headers.
         (insert text)
         (goto-char (point-min))
         (org-mode)
-        (org-mime-src-mode))))))
+        (org-mime-src-mode)
+        
+        ;; Set relevant local variables in `org-mime-src-mode' org
+        ;; buffer
+        (setq org-mime--saved-temp-window-config window-config
+              org-mime-src--beg-marker beg
+              org-mime-src--end-marker end
+              org-mime-src--overlay overlay))))))
 
 (defun org-mime-revert-to-plain-text-mail ()
   "Revert mail body to plain text."

Reply via email to